七. JAVA类和对象(二)
hello!这里是敲代码的小董,很荣幸您阅读此文,本文只是自己在学习JAVA过程中的笔记,如有不足,期待您的评论指点和关注,欢迎欢迎~~
✨✨个人主页:敲代码的小董
💗💗系列专栏:JAVA
目录
5. 对象的构造及初始化
5.1 如何初始化对象
5.2 构造方法
5.2.1 概念
5.2.2 特性
5.3 默认初始化
5.4 就地初始化
上一节:七. JAVA类和对象(一)
5. 对象的构造及初始化
5.1 如何初始化对象
通过前面知识点的学习知道,在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败。
public static void main(String[] args) {int a;System.out.println(a);
}
// Error:(26, 28) java: 可能尚未初始化变量a
要让上述代码通过编译,非常简单,只需在正式使用a之前,给a设置一个初始值即可。如果是对象:
public static void main(String[] args) {Date d = new Date();d.printDate();d.setDate(2021,6,9);d.printDate();
}
// 代码可以正常通过编译
需要调用之前写的SetDate方法才可以将具体的日期设置到对象中。
通过上述例子发现两个问题:
1. 每次对象创建好后调用SetDate方法设置具体日期,比较麻烦,那对象该如何初始化?
2. 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?
对象初始化是为新建对象分配内存空间并设置初始值的过程。在面向对象编程中,正确的初始化是保证对象状态有效性的关键。
常见的初始化方式包括:
- 构造方法初始化
- 默认初始化
- 声明时初始化(就地初始化)
// 示例:三种初始化方式的综合体现
public class Smartphone {private String brand; // 默认初始化为nullprivate int storage = 128; // 就地初始化private double price;// 构造方法初始化public Smartphone(String brand, double price) {this.brand = brand;this.price = price;}
}
5.2 构造方法
5.2.1 概念
构造方法是类中用于初始化对象的特殊方法,具有以下特征:
- 方法名与类名完全相同
- 没有返回类型(包括void)
- 在对象创建时自动调用
- 可以重载(多个参数列表不同的构造方法)
public class Date {public int year;public int month;public int day;// 构造方法:// 名字与类名相同,没有返回值类型,设置为void也不行// 一般情况下使用public修饰// 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次public Date(int year, int month, int day){this.year = year;this.month = month;this.day = day;System.out.println("Date(int,int,int)方法被调用了");}public void printDate(){System.out.println(year + "-" + month + "-" + day);}public static void main(String[] args) {// 此处创建了一个Date类型的对象,并没有显式调用构造方法Date d = new Date(2021,6,9); // 输出Date(int,int,int)方法被调用了d.printDate(); // 2021-6-9}
}
注意:构造方法的作用就是对 对象中的成员进行初始化,并不负责给对象开辟空间。
5.2.2 特性
1. 名字必须与类名相同
2. 没有返回值类型,设置为void也不行
3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
public class Date {public int year;public int month;public int day;// 无参构造方法public Date() {this.year = 1900;this.month = 1;this.day = 1;}// 带有三个参数的构造方法public Date(int year, int month, int day) {this.year = year;this.month = month;this.day = day;}public void printDate() {System.out.println(year + "-" + month + "-" + day);}public static void main(String[] args) {Date d = new Date();d.printDate();}
}
上述两个构造方法:名字相同,参数列表不同,因此构成了方法重载。
5. 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。
public class Date {public int year;public int month;public int day;public void printDate(){System.out.println(year + "-" + month + "-" + day);}public static void main(String[] args) {Date d = new Date();d.printDate();}
}
上述Date类中,没有定义任何构造方法,编译器会默认生成一个不带参数的构造方法。
注意:一旦用户定义,编译器则不再生成。
6. 构造方法中,可以通过this调用其他构造方法来简化代码
注意:
- this(...)必须是构造方法中第一条语句。
- 不能形成环。
7. 绝大多数情况下使用public来修饰,特殊场景下会被private修饰(单例模式)
5.3 默认初始化
为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?
局部变量未初始化:
成员变量未初始化:
当成员变量未显式初始化时,Java会根据数据类型自动进行默认初始化:
5.4 就地初始化
在声明成员变量时直接赋值,这种初始化方式:
- 在构造方法执行前完成
- 适合固定初始值的场景
- 可以结合构造方法混合使用
public class Student {// 就地初始化private String school = "清华大学";private final int MAX_COURSES = 6; // 常量初始化private String name;private List<String> courses = new ArrayList<>(); // 复杂类型初始化public Student(String name) {this.name = name;}public void addCourse(String course) {if(courses.size() < MAX_COURSES) {courses.add(course);}}// 使用示例public static void main(String[] args) {Student stu = new Student("王小明");stu.addCourse("计算机组成原理");System.out.println("所属院校:" + stu.school); // 输出清华大学}
}
下一节:七. JAVA类和对象(三)-CSDN博客