继承初始化父类和子类的过程

举报
brucexiaogui 发表于 2021/12/30 00:10:32 2021/12/30
【摘要】 继承初始化父类和子类的过程   一、子类和父类初始化顺序        1、当调用某个类的构造器来创建java对象时,系统总会先调用父类的非静态初始化块进行初始化,这个调用是隐式执行。而且父类的静态初始化块总会被执行。 2、接着调用父类的一个或...
继承初始化父类和子类的过程
 
一、子类和父类初始化顺序
 
     1、当调用某个类的构造器来创建java对象时,系统总会先调用父类的非静态初始化块进行初始化,这个调用是隐式执行。而且父类的静态初始化块总会被执行。
2、接着调用父类的一个或多个构造器执行初始化,这个调用通过super进行调用是显示调用。也可以通过隐式调用。(隐式调用:子类构造器没有super调用,也没有this调用,系统会在执行子类构造器之前,隐式调用父类无参的构造器)
3、所有的父类非静态初始化块、构造器依次调用完毕后,系统调用本类的非静态初始化块,构造器执行初始化,最后返回本类的实例。
 
二、子类和父类初始化顺序实例

   
  1. package java022;
  2. class Creature{
  3. {
  4. System.out.println("Creature的非静态初始化块");
  5. }
  6. //定义两个构造器
  7. public Creature(){
  8. System.out.println("Creature无参数的构造器");
  9. }
  10. public Creature(String name){
  11. //使用this调用无参数的重载构造器Creature()
  12. this();
  13. System.out.println("Creature带有一个参数name的构造器:"+name);
  14. }
  15. }
  16. class Animal extends Creature{
  17. {
  18. System.out.print("Animal非静态初始化块");
  19. }
  20. public Animal(String name){
  21. super(name);
  22. System.out.println("Animal带有一个参数的构造器,name参数:"+name);
  23. }
  24. public Animal(String name,int age){
  25. //使用this调用本类的另一个重载构造器Animal(String name)
  26. System.out.println("Animal带有两个参数的构造器,其age:"+age);
  27. }
  28. }
  29. class Wolf extends Animal{
  30. {
  31. System.out.println("wolf的非静态初始块");
  32. }
  33. public Wolf(){
  34. super("小鬼当家",23);
  35. System.out.println("wolf无参的构造器");
  36. }
  37. public Wolf(double weight){
  38. //使用this调用另一个重载的构造器Wolf()
  39. this();
  40. System.out.println("wolf的带weight参数的构造器,weight参数:"+weight);
  41. }
  42. }
  43. public class InitTest {
  44. public static void main(String []args){
  45. new Wolf(9.6);
  46. }
  47. }
结果
上面的程序定义了 Creature、Animal、Wolf 这3个类,其中Animal是Creature的子类,Wolf是Animal的子类。3个类都包含了非静态的初始化块,构造器。当程序创建Wolf实例时,程序会按上面的初始化步骤执行初始化。结果如下:

   
  1. Creature的非静态初始化块
  2. Creature无参数的构造器
  3. Animal非静态初始化块Animal带有两个参数的构造器,其age:23
  4. wolf的非静态初始块
  5. wolf无参的构造器
  6. 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。