java创建对象时代码执行顺序探讨

  1. 没有继承父类情况下,在创建对象时候相关代码的执行顺序: 静态代码块/静态成员变量 > 构造代码块 > 成员变量 > 构造方法 对于同一级别的部分按照顺序从前往后执行,下面举例说明
    以下是classA.java文件内容
    package com.mzbonnt.classabout;
    
    public class ClassA {
    	
    	{
    		System.out.println("父类构造代码块1");
    	}
    	
    	{
    		System.out.println("父类构造代码块2");
    	}
    
    	static 
    	{
    		System.out.println("父类静态代码块1");
    	}
    	
    	public ClassA() {
    		System.out.println("父类无参构造函数");
    	}
    	
    	public ClassA(String str)
    	{
    		System.out.println("父类有参构造函数" + str);
    	}
    	
    }
    
    以下是ConstructorDemo.java文件
    package com.mzbonnt.classabout;
    
    /**
     * 创建对象时相关代码执行顺序,静态代码块 > 构造代码块 > 成员变量 > 构造方法
     * @author hp
     *
     */
    public class ConstructorDemo{
    	
    	private ClassA classTestA = new ClassA();
    	
    	{
    		System.out.println("子类构造代码块1");
    	}
    	
    	static 
    	{
    		System.out.println("子类静态代码块1");
    	}
    	private static ClassA classTestB = new ClassA("classTestB");
    	
    	{
    		System.out.println("子类构造代码块2");
    	}
    	
    	static 
    	{
    		System.out.println("子类静态代码块2");
    	}
    	
    	public ConstructorDemo() {
    		System.out.println("子类无参构造函数");
    	}
    	
    	public static void main(String[] args)
    	{
    		ConstructorDemo demo = new ConstructorDemo();
    	}
    
    }
    
    以下是执行结果
    子类静态代码块1
    父类静态代码块1
    父类构造代码块1
    父类构造代码块2
    父类有参构造函数classTestB
    子类静态代码块2
    父类构造代码块1
    父类构造代码块2
    父类无参构造函数
    子类构造代码块1
    子类构造代码块2
    子类无参构造函数

  2. 继承父类情况下,在创建子类时会如果没有显式调用父类构造函数,则会自动调用父类无参构造函数,因此,如果父类声明了有参构造函数时,就必须显式声明无参构造函数。创建对象时,相关代码的执行顺序:父类静态代码块 > 子类静态代码块>父类构造部分>子类构造部分,其中父类构造部分包括:父类构造代码块>父类成员变量>父类构造函数,子类构造部分包括:子类构造代码块>子类成员变量>子类构造函数,同一级别的部分按照顺序从前往后,下面举例说明
    下面是classA.java文件内容
    package com.mzbonnt.classabout;
    
    public class ClassA {
    	
    	{
    		System.out.println("父类构造代码块1");
    	}
    	
    	{
    		System.out.println("父类构造代码块2");
    	}
    
    	static 
    	{
    		System.out.println("父类静态代码块1");
    	}
    	
    	public ClassA() {
    		System.out.println("父类无参构造函数");
    	}
    	
    	public ClassA(String str)
    	{
    		System.out.println("父类有参构造函数" + str);
    	}
    	
    }
    
    下面是ConstructorExtendDemo.java文件内容
    package com.mzbonnt.classabout;
    
    public class ConstructorExtendDemo extends ClassA{
    
    	/**
    	 * 继承父类情况下
    	 * 创建对象时相关代码执行顺序,静态代码块 > 构造代码块 > 成员变量 > 构造方法
    	 * 同一部分代码块则按照位置先后顺序来执行
    	 * @author hp
    	 *
    	 */
    	private ClassA classTestA = new ClassA();
    	
    	{
    		System.out.println("子类构造代码块1");
    	}
    	
    	static 
    	{
    		System.out.println("子类静态代码块1");
    	}
    	private static ClassA classTestB = new ClassA("classTestB");
    	
    	{
    		System.out.println("子类构造代码块2");
    	}
    	
    	static 
    	{
    		System.out.println("子类静态代码块2");
    	}
    	
    	public ConstructorExtendDemo(String str) {
    		super(str);
    		System.out.println("子类有参构造函数");
    	}
    	
    	public static void main(String[] args)
    	{
    		ConstructorExtendDemo demo = new ConstructorExtendDemo("childClass");
    	}
    }
    
    下面是执行结果:
    父类静态代码块1
    子类静态代码块1
    父类构造代码块1
    父类构造代码块2
    父类有参构造函数classTestB
    子类静态代码块2
    父类构造代码块1
    父类构造代码块2
    父类有参构造函数childClass
    父类构造代码块1
    父类构造代码块2
    父类无参构造函数
    子类构造代码块1
    子类构造代码块2
    子类有参构造函数


你可能感兴趣的:(java,构造函数,静态代码块,初始化块)