2.类和对象的定义与使用( 二 )


1.构造方法:(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次 。
2.作用:用来给成员变量进行初始化,也就是产生对象
3.使用new关键字产生一个对象时,大致分为以下两步:
(1) 为对象分配内存(空间大小由该类中成员变量的属性决定)
(2) 调用合适的构造方法来初始化当前对象中的成员变量
4.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 Date(){}*/}public static void main(String[] args) {//当创建对象时默认调用该类的构造方法Date d = new Date();d.printDate();}}
6.如果用户自己定义了构造方法,编译器则不再生成 。
public class Date {public int year;public int month;public int day;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();}}/*Error:(26, 18) java: 无法将类 extend01.Date中的构造器 Date应用到给定类型;需要: int,int,int找到: 没有参数原因: 实际参数列表和形式参数列表长度不同*/
7. 构造方法中,可以通过this调用其他构造方法来简化代码
public class Date {public int year;public int month;public int day;// 无参构造方法--内部给各个成员赋值初始值,该部分功能与三个参数的构造方法重复// 此处可以在无参构造方法中通过this调用带有三个参数的构造方法// 但是this(1900,1,1);必须是构造方法中第一条语句public Date(){//System.out.println(year); 注释取消掉,编译会失败this(1900, 1, 1);//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;}}
不过这么做有两点需注意:
1.this(...)必须是构造方法中第一条语句
2.不能形成环,否则构造方法会死循环
public Date(){this(1900,1,1);}public Date(int year, int month, int day) {this();} /* 报错:无参构造器调用三个参数的构造器,而三个参数构造器有调用无参的构造器,形成构造器的递归调用编译报错:Error:(19, 12) java: 递归构造器调用*/