子父类构造函数的特点

子父类中成员函数的特点。
当子父类都有构造函数时,发现结果为:
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()
    {}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值