继承初始化父类和子类的过程
        【摘要】 
                    
 继承初始化父类和子类的过程
 
  
 
 一、子类和父类初始化顺序
 
  
 
      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)