前言
今天在看书的时候,看到了关于继承的知识,突然觉得之前的理解还是不够,就想着把学到的关于构造器的知识记录下来
概念
相信大部分人都知道java里边的构造器在做一件什么样的事———创建实例对象时进行初始化,比如
public class Test {
private String name;
private int age;
public boolean is_man;
public Test(){ }
public static void main(String[] args) {
Test test=new Test();
}
}
上边这段代码在做着一件简简单单的事情,在堆内存中申请一块内存,创建类的实体对象并为变量赋初值(数值型为0,布尔型为false)。很多人会认为执行构造器方法就是在创建方法,事实上在构造器方法执行前系统已经创建了对象,只不过该对象当前还不能被外界访问而已,构造器函数当前只是执行了成员变量的初始化功能。
继承中的构造器
在这里有一个很典型的例子
class Animal{
public final String msg="I'am animal";
public Animal(){
System.out.println(msg);
}
public Animal(String name){
System.out.println(name+" belongs to animal");
}
}
class Human extends Animal{
public final String msg="I'am human";
public Human(){
System.out.println(msg);
}
public Human(int history){
super("horse");
System.out.println("Human society has a long history about "+history+" years");
}
}
class Woman extends Human{
public final String msg="I'am a woman";
public Woman(){
super(5000);
System.out.println(msg);
}
}
上边的程序生动的展现了类继承树中构造器方法的调用顺序,当创建一个子类对象时,系统会依次向上回溯,从继承树顶端的Object类的构造器开始执行,依次往下执行,当在子类中显式调用重载的父类构造器函数时,便不再执行默认的构造器,如果未显式调用时则执行默认的构造器函数,上面代码的执行结果如下:
horse belongs to animal
Human society has a long history about 5000 years
I'am a woman
最后,重要的事情说三遍:
创建子类对象时没有创建父类对象,只是执行了父类的构造器函数!
创建子类对象时没有创建父类对象,只是执行了父类的构造器函数!
创建子类对象时没有创建父类对象,只是执行了父类的构造器函数!