1. 构造器基本概念:
1) Java构造器和C++基本一致;
2) 主要特点:
i. 名称和类名一样;
ii. 不得有返回类型(其默认返回构造的对象本身(this)),如果你强行加返回类型,系统就会把它当做一个普通的方法了,必须通过引用来调用,而不是用new来调用了;
iii. 会在初始化代码执行之后再执行:其实构造器执行的时间点已经很晚了,创建一个对象时会先为对象分配内存空间,然后执行初始化代码,最后再执行构造器;
iv. 和普通方法一样可以重载;
v. 访问控制符任意,特殊情况下可以用private限定,这就组织了类外部使用该构造器创建对象,一般是为了设计单例模式等;
vi. 构造器是无论如何必须要有的,如果用户不自己定义,Java就会隐式提供一个无参的、空的构造器,但一旦用户自己定义了一个构造器(只要有定义),Java就不会再提供那个默认的无参空的构造器了!
3) 构造器的真正作用:
i. 初始化代码其实就是无参初始化行为,其作用是取代无参构造器;
ii. 那么构造器的真正作用就是有参初始化了,Java构造器就是为了接受参数,根据指定的参数在初始化代码的默认初始化基础上对成员数据进一步初始化;
2. 在一个构造器中调用其它重载的构造器:
1) 使用this调用,表示调用的是本对象中的其它构造器(不能是父类构造器,父类构造器无法继承);
2) 例如:this(name, age);表示调用的是另一个重载的构造器:MyClass(String name, int age);
3) 规则:
i. 使用this调用其它版本的构造器的形式只能在构造器中使用,不能在其它方法中使用;
ii. 如果不用this调用构造器,而是用类名来调用构造器就只能使用new运算符了,而new运算符是创建了一个新的对象,并非本身;
iii. this调用其它构造器的语句必须是构造器的第一句,并且最多只能有一句!!
3. 调用父类构造器:
1) Java规定,初始化一个对象时必须要先初始化其父类部分,即一层一层追溯到Object为止;
2) 这就意味着,Java也规定了一个类的构造器里,第一句必须是调用父类的构造器!!
i. 但之前我们写的构造器代码中都没有在第一句调用父类构造器啊!!
ii. 那是因为,如果第一句不是调用父类构造器代码也不是this调用其它构造器的话,那系统就隐式帮你调用父类无参的构造器(super());
iii. 如果第一句是this调用其它构造器,那么调用父类构造器的工作就交给this调用的那个重载构造器了;
!!这是一个递归定义;
3) 如果你不想使用默认的父类的无参构造器来初始化父类部分,就必须自己显示指定了:
i. 和this差不多,调用父类构造器使用super关键字;
ii. 例如:super(name, age);表示调用父类有参构造器,参数是String name和int age;
!注意,加了super限定后,调用的构造器就是父类的版本了!!
iii. 和this一样,使用super调用父类构造器的代码必须是构造器的第一行,并且做多只能有一次,这就导致了不能同时使用super和this调用构造器;
!!这是正常的,因为使用this调用的其它重载构造器中也是会调用父类构造器的,因此同时使用super和this调用构造器功能上就重复了;