继承---子父类中构造器特点
|
总结: 1子类所有构造器里面的第一句都是默认的隐式super(),导致建立对象时,子类构造器运行前父类构造器会先运行。 2子类构造器中的隐式super()默认空参,可以根据实际父类的构造器来写空参或实参的super()。 |
|
【】子类构造器里面第一行存在默认的super(),所以会在子类构造器运行前先调用父类的构造器。 super()是隐式的,不写也在那个位置。 【】super(),默认是空参数构造器,父类如果构造器是实参数的,那么就会编译失败。 如果父类构造器是实参数的,那么子类应该把super()直接写出来并且写成对应实参数的。
【】super(4)调用父类的构造函数 【】子类中有多个构造器,每个构造器里面第一句都是super(),除非把super()直接写出来,否则默认指向父类空构造器。 |
|
|
|
【】子类里面如果构造器第一行写this(),就占用了super(),他们都只能写在第一行。但是this()会调用子类另一个构造器,另一个构造器的第一行默认是super(),也能保证首先给父类初始化的目标。 |
|
【】任意一个类,他的构造函数,默认第一行隐式的super()给父类初始化,默认最后一句return;结束函数运行。 【】java是面向对象的语言,认为对象都有共性会进行抽取,最终抽取了一个最顶层的类object。 程序员写的任何类、任何对象都是object的子类,要么是直接要么是间接,都默认extends object。 object就是java的祖宗,是根类。
|
| 内存图解 |
|
【】main方法进栈,变量z在主函数开辟空间 【】右侧new Zi();首先类中方法进入方法区,因zi extends Fu,所以fu类首先方法区,之后子类方法进入方法区 【】右侧new Zi();堆内存建立zi对象,内存地址0034,成员属性默认初始化为0;然后,构造器zi()初始化开始。 【】zi()构造函数进栈,持有this指向0034,第一句super(),调用fu()构造函数进栈,持有this指向唯一对象0034, 启动show(),同名函数,zi对象从方法区首先找zi的方法。父中该方法被子覆盖,调用zi的show方法。此时num=0; 之后fu()构造器弹栈,剩下zi()构造器, 【】父构造器完成初始化后,也就是super()完成后,才轮到子中成员显示初始化num=8; 先把父类东西忙完,再干自己的活。 (默认初始化-显示初始化-构造函数初始化) 【】 【】zi调用show方法,打印出num就是8; |
|
|
|
总结:子父类中 父类属性,子类直接拥有,子类中出现同名属性会优先使用子类中自己的属性。在子类中,要明确使用同名父类属性,需要加super代指父类空间。 父类函数,子类直接拥有,子类中出现同名函数会视为对父类同名函数的覆盖重写。在子类中,要明确使用同名父类函数,需要加super 子类对象建立,调用子类构造器,构造器中第一句就是super(),先执行父类构造函数。父类构造函数完成,子类对象的属性才执行显式初始化,子类构造器才能执行。 |











浙公网安备 33010602011771号