// 父类Apackageextend1;publicclassA{publicA(){System.out.print("A类的无参构造器被调用\n");}}// 子类B 继承 父类Apackageextend1;publicclassBextendsA{publicB(){// super默认存在,优先调用父类的构造器,之后才执行子类的构造器super();// 默认调用父类的无参构造器,如果没有,需要指定使用父类的哪个构造器System.out.print("子类B的无参构造器被调用\n");}}// 主类packageextend1;publicclass test {publicstaticvoidmain(String[] args){B b =newB();}}// 输出结果A类的构造器被调用
子类B的无参构造器被调用
代码解析:创建子类 B 对象时,优先调用父类的无参构造器,输出后,再调用子类的构造器,如果父类的无参构造器被覆盖或者没有显示声明需要用 super 指定调用父类的构造器
二、super调用父类指定的构造器
// 父类Apackageextend1;publicclassA{String name;int age;publicA(){System.out.println("A类的无参构造器被调用");}publicA(String name){this.name = name;System.out.println("A类中public A(String name)构造器被调用");}publicA(int age){this.age = age;System.out.println("A类中public A(int age)构造器被调用");}publicA(String name,int age){this.name = name;this.age = age;System.out.println("A类中带有全部属性初始化的构造器被调用");}publicvoidprintinfo(){System.out.println("A类的print函数被调用");System.out.print("姓名:"+ name +"\n年龄:"+ age);System.out.println("\n");}}// 子类Bpackageextend1;publicclassBextendsA{publicB(){}publicB(int age){super(age);System.out.println("子类B的无参构造器被调用");}publicvoidprintinfo(){System.out.println("B类的print函数被调用");System.out.print("姓名:"+ name +"\n年龄:"+ age);System.out.println("\n");}}// 主类packageextend1;publicclass test {publicstaticvoidmain(String[] args){/*
共有的属性
int age;
String name
对于 父类A 可以初始化 age/name/age,name
对于 子类B 可以初始化 age (使用super指定了)
*/A a =newA("jackson",18);
a.printinfo();// 测试 子类B 中的无参构造器B b =newB();
b.printinfo();// 测试 子类B 中用super调用主类中指定的构造器B b1 =newB(18);
b1.printinfo();}}// 输出结果A类中带有全部属性初始化的构造器被调用
A类的print函数被调用
姓名:jackson
年龄:18A类的无参构造器被调用
B类的print函数被调用
姓名:null
年龄:0A类中publicA(int age)构造器被调用
子类B的无参构造器被调用
B类的print函数被调用
姓名:null
年龄:18
代码解析
通过输出结果可以发现两点
(1)子类调用构造器时优先调用父类的无参构造器
(2)在子类的构造器中可以用super指定调用父类中的哪一个构造器
继承的内存分析(本质)
对象创建好之后会建立查找关系
首先看子类是否有该属性
如果子类有这个属性,并且可以访问,则返回信息
如果子类没有这个属性,就看父类有没有这个属性(如父类有该属性,并且可以访问,就返回信息)
如果父类没有就按(3)的规则,继续找上级父类,直到 Object…
publicclass pra {publicstaticvoidmain(String[] args){Son son =newSon();// 创建 Son 类的对象System.out.println("son.name:"+ son.name);System.out.println("son.age:"+ son.age);System.out.println("son.hobby:"+ son.hobby);}}classGrandPa{// 爷爷类String name ="大头爷爷";String hobby ="钓鱼";}classFatherextendsGrandPa{// 父亲类继承爷爷类String name ="大头爸爸";int age =39;}classSonextendsFather{// 儿子类继承父亲类String name ="大头儿子";}// 输出结果
son.name:大头儿子
son.age:39
son.hobby:钓鱼