继承中的构造函数解析

注:以下内容都是笔者自己为了方便理解改变继承知识
1 概念:
继承就是子类可以拥有父类的一切东西(构造方法除外),至于说父类的private 的属性或者方法子类是否可以继承过来,答案是yes,但是这些属性归父类所拥有,所以即使你继承过来,也 用不了,但是有途径去使用。
2:实例

Hero 父类
public class Hero {
 private int age;
 private double strenth;
 private double atk;//攻击力
 private double def;
 Hero(){
 System.out.println("父类的构造函数ing");
 }
public Hero(int age, double strenth, double atk, double def) {
    System.out.println("");
    this.age = age;
    this.strenth = strenth;
    this.atk = atk;
    this.def = def;
}
//省略一些get  set方法
BatMan:子类
public class BatMan extends Hero {

}

BatMan 已经继承了父类,就拥有了父类的东西,有同学会问,那么在子类如果也要定义和父类一样的属性用不用属性呢?其实不用。有的同学认为既然父类的private 成员子类用不了,就得自己重新写啊。这里就得用父类的构造函数,既然子类已经全部继承了父类的东西,我不可以用或者初始化private成员,但是我可以调用父类的一些方法去使用或者去初始化。
我们完善一下BatMan:子类

public class BatMan extends Hero {
BatMan (){}
 BatMan(int age, double strenth, double atk, double def) {

        super(age, strenth, atk, def);
    }
}

这里用到了super 关键字,该关键字意义是,BatMan 调用父类的有参构造去初始化自己成员,因为自己不能初始化啊,所以我调用父类的帮自己去初始化,这里是显示去调用父类的构造函数。

测试类代码:
        BatMan batman=new BatMan(20,30,40,50);
        System.out.println(batman.getAge());
    /////输出结果:20.

接下来讲一下隐士去调用父类的构造

重新添加一下子类的构造函数
public class BatMan extends Hero {
BatMan (){
 // super();
   System.out.println("子类的构造函数ing");
}

}
测试类代码:
        BatMan batman=new BatMan();
    /////输出结果  父类的构造函数ing
                 子类的构造函数ing
解析:子类在new时候,去调用子类构造函数,因为子类继承了父类,所以jvm在子类的构造函数里面隐士的添加了super关键字,去调用父类的无参构造。如果子类自己显示的去调用父类的某一个构造函数,jvm就不会添加super关键字了。

构造连:

public class sunzi extends baba{
    sunzi(){
    //jvm添加了super();
        System.out.println("孙子的构造函数ing");
    }
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        sunzi s=new sunzi();
    }

}
class baba extends yeye{
    baba(){
    //jvm添加了super();
        System.out.println("爸爸的构造函数ing");
    }
}
class yeye{
    yeye(){
        System.out.println("爷爷的构造函数执行");
    }
}
输出结果:爷爷的构造函数执行
        爸爸的构造函数ing
        孙子的构造函数ing

你可能感兴趣的:(继承,构造函数,java)