1.构造方法的意义
对象都是有初始属性的,例如人一出生就有体重,身高等,而不同的婴儿会有不同的初始属性。在Java中,用构造方法来在创建对象的同时初始化对象的属性。
2.构造方法的特点
- 构造方法的名称与本类的名称相同
- 构造方法无返回值
- 如果在类中没有定义构造方法,那么编译器会默认赠送一个,给这个类一个构造方法。若已经定义了构造方法,那就不会赠送了。
3.构造方法与new之间的联系
个人对这两个的理解,就是java通过使用new关键字调用构造方法创建对象。构造方法是用来初始化对象的,而创建对象时,初始化和创建是被捆绑在一起的。
看这个例子:
public class CreateObject {
public CreateObject() { // 构造方法
System.out.println("创建对象");
}
public static void main(String args[]) { // 主方法
new CreateObject(); // 创建对象
}
}
//输出:
创建对象
这程序说明了,在创建对象的同时,自动调用构造方法,二者是捆绑在一起的。
参考:穆哥学堂
4.无参构造和有参构造
先提一点:
- 重写:子类对父类方法的覆盖
- 重载:本类中的同名方法,参数不同
这里提一点,关于构造方法,又被称为构造器,个人认为称为构造方法有助于加深记忆。既然他是一种方法,也存在方法的性质,那么就可以被重载(不能重写),这里即为有参构造。
那么,为什么要有这两种构造方法呢?他们可以同时存在于一个类中吗?
- 先理解一下第一个问题,例如养成游戏,在创建一个角色时,需要对角色的属性进行初始化,若使用无参构造,则所创建角色属性全为一样的,假如我们让初始的角色属性值不同,那么有参构造就起作用了。也就是说不同的对象部分的属性可能不相同,初始化时需要无参和有参的有机结合。
- 再看第二个问题,是可以同时存在于一个类中的,根据调用方法的格式,来决定调用的是哪种构造方法。
总的来说,构造方法用来创建对象同时初始化对象,而构造方法重载使得创建对象更加灵活,便于创建不同的对象。
5.继承中子类和父类构造方法的联系
先看下面一段代码:
class Parent { // 父类
Parent() {
System.out.println("调用父类的parent()构造方法");
}
}
class SubParent extends Parent { // 继承Parent类
SubParent() {
System.out.println("调用子类的SubParent()构造方法");
}
}
public class Subroutine extends SubParent { // 继承SubParent类
Subroutine() {
System.out.println("调用子类的Subroutine()构造方法");
}
public static void main(String[] args) {
Subroutine s = new Subroutine(); // 实例化子类对象
}
}
#输出结果
调用父类的parent()构造方法
调用子类的SubParent()构造方法
调用子类的Subroutine()构造方法
可以看到,在继承的机制中,在实例化子类对象时,java编译器会在子类的构造方法中自动调用父类的无参构造方法,而不是子类继承了父类的构造方法。换句话说,实例化子类对象时首先要实例化父类对象,然后再实例化子类对象。
参考:java从入门到精通,清华大学出版社