继承初始化父类和子类的过程
【摘要】
继承初始化父类和子类的过程
一、子类和父类初始化顺序
1、当调用某个类的构造器来创建java对象时,系统总会先调用父类的非静态初始化块进行初始化,这个调用是隐式执行。而且父类的静态初始化块总会被执行。
2、接着调用父类的一个或...
继承初始化父类和子类的过程
一、子类和父类初始化顺序
1、当调用某个类的构造器来创建java对象时,系统总会先调用父类的非静态初始化块进行初始化,这个调用是隐式执行。而且父类的静态初始化块总会被执行。
2、接着调用父类的一个或多个构造器执行初始化,这个调用通过super进行调用是显示调用。也可以通过隐式调用。(隐式调用:子类构造器没有super调用,也没有this调用,系统会在执行子类构造器之前,隐式调用父类无参的构造器)
3、所有的父类非静态初始化块、构造器依次调用完毕后,系统调用本类的非静态初始化块,构造器执行初始化,最后返回本类的实例。
二、子类和父类初始化顺序实例
-
package java022;
-
class Creature{
-
{
-
System.out.println("Creature的非静态初始化块");
-
}
-
//定义两个构造器
-
public Creature(){
-
System.out.println("Creature无参数的构造器");
-
}
-
-
public Creature(String name){
-
//使用this调用无参数的重载构造器Creature()
-
this();
-
System.out.println("Creature带有一个参数name的构造器:"+name);
-
}
-
}
-
-
class Animal extends Creature{
-
{
-
System.out.print("Animal非静态初始化块");
-
}
-
public Animal(String name){
-
super(name);
-
System.out.println("Animal带有一个参数的构造器,name参数:"+name);
-
}
-
public Animal(String name,int age){
-
//使用this调用本类的另一个重载构造器Animal(String name)
-
System.out.println("Animal带有两个参数的构造器,其age:"+age);
-
}
-
}
-
-
class Wolf extends Animal{
-
{
-
System.out.println("wolf的非静态初始块");
-
}
-
-
public Wolf(){
-
super("小鬼当家",23);
-
System.out.println("wolf无参的构造器");
-
}
-
public Wolf(double weight){
-
//使用this调用另一个重载的构造器Wolf()
-
this();
-
System.out.println("wolf的带weight参数的构造器,weight参数:"+weight);
-
}
-
}
-
public class InitTest {
-
public static void main(String []args){
-
new Wolf(9.6);
-
}
-
-
}
结果 :
上面的程序定义了 Creature、Animal、Wolf 这3个类,其中Animal是Creature的子类,Wolf是Animal的子类。3个类都包含了非静态的初始化块,构造器。当程序创建Wolf实例时,程序会按上面的初始化步骤执行初始化。结果如下:
-
Creature的非静态初始化块
-
Creature无参数的构造器
-
Animal非静态初始化块Animal带有两个参数的构造器,其age:23
-
wolf的非静态初始块
-
wolf无参的构造器
-
wolf的带weight参数的构造器,weight参数:9.6
1、只要在程序创建java对象,系统总是会先调用顶层父类的初始化操作,包括初始化块,构造器,然后依次向下调用父类的初始化操作,最终执行本类的初始化操作,返回本类对象。
2、调用父类的哪个构造器执行初始后分为以下几个情况:
A、子类的构造器执行体的第一行代码使用super显式调用父类构造器,系统将根据super调用里传入的实参列表来确定调用父类的哪个构造器。
B、子类构造器执行体的第一行代码使用this显式调用本类中重载构造器,系统将根据this传入出实参地要用本类的另一个构造器。(然后执行本类另一个构造器时即可进入第一种情况)
C、子类构造器执行体中既没有super调用,也没有this调用,系统将会在执行子类构造器之前,隐式调用父类无参构造器。
注意:
①、super用于 显示调用父类的构造器,this用于 显示调用本类中另一个重载构造器。
②、super和this调用都 只能在构造器中使用,而且super调用和this调用都必须作为构造器的第一行代码。
③、在构造器中super和this只能使用其中之一,而且最多只能调用一次。
文章来源: brucelong.blog.csdn.net,作者:Bruce小鬼,版权归原作者所有,如需转载,请联系作者。
原文链接:brucelong.blog.csdn.net/article/details/76150125
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)