子父类构造函数的特点

来源:互联网 发布:js判断chrome版本 编辑:程序博客网 时间:2024/05/18 01:46

子父类中成员函数的特点。
当子父类都有构造函数时,发现结果为:
fu constructor run
zi constructor run
先执行了父类的构造函数,再执行子类的构造函数
为什么?
因为子类的所有的构造函数中的第一行都有一句隐式语句super();//默认调用的是父类中的空参数的构造函数。

class Fu {    Fu()    {        System.out.println("fu constructor run");    }}class Zi extends Fu{    Zi()    {        //super();        System.out.println("zi constructor run");    }}

子类中的构造函数为什么有一句隐式的super()呢?
原因:子类会继承父类中的内容,所以子类在初始化时,必须先到父类中执行父类的初始化动作。才可以更方便地使用父类中的内容。

当父类中没有空参数构造函数时,子类的构造函数必须通过显示的super语句指定要访问的父类中的构造函数。
这就是子类实例化的过程.

class Fu {    Fu()    {        System.out.println("fu constructor run..a..");    }    Fu(int x)    {        //显示初始化        System.out.println("fu constructor run..b.."+x);    }}class Zi extends Fu{    Zi()    {        //super();        System.out.println("zi constructor run..c..");    }    Zi(int x)    {        //super();        System.out.println("zi constructor run..d.."+x);    }}class ExtendsDemo3{    public static void main(String[] args)    {        new Zi();        new Zi(6);    }}

打印的结果是:a c a d .

细节
1,如果子类的构造函数第一行写了this调用了本类其他构造函数语句,那么super调用父类的语句还有吗?
没有的,因为this()或者super()只能定义在构造函数的第一行,因为初始化动作要先执行。

2,父类构造函数中是否有隐式的super呢?
有的,记住:只要是构造函数默认第一行都是super();
父类的父亲是谁呢?super调用的到底是谁的构造函数呢?
java体系在设计,定义了一个所有对象的父类Object。

总结
类中的构造函数默认第一行都有隐式的super()语句,在访问父类中的构造函数。
所以父类的构造函数既可以给自己的对象初始化,也可以给自己的子类对象初始化。

问题
1,this语句和super语句是否可以在同一个构造函数中出现呢?
不行,因为必须定义在第一行。
2,为什么要定义在第一行呢?
因为初始化的动作要先执行。

子类的实例化过程的应用,也是super调用的应用。
什么时候用super调用父类中构造函数,只要使用父类的指定初始化动作,就在子类中通过super(参数列表)格式进行调用。

class Person{    private String name;    private int age;    public Person(String name,int age)    {        this.name=name;        this,age=age;    }    public void setName(String name)    {        this name=name;    }    public int getName()    {        return name;    }    public void setAge(int age)    {        this.age=age;    }    public int getAge()    {        return age;    }}class Student extends Person{    public Student(String name,int age)    {        super(name,age);    }    public void study()    {}}class Worker extends Person{    public Worker(String name,int age)    {        //调用父类,使用父类的初始化动作        super(name,age);    }    public void work()    {}}
0 0
原创粉丝点击