zoukankan      html  css  js  c++  java
  • Java构造方法的执行顺序

    1.如果类里边没有定义任何构造方法,则系统将添加一个默认的无参构造方法。

    Class ThisClass{
    
    }

    默认隐式添加无参的构造方法,相当于

    Class ThisClass{
    	public ThisClass(){
    	}
    }

    2.构造方法的执行顺序。

        (1)如果构造方法中没有在第一条语句中显式调用父类的构造方法,也没有调用本类的重载构造方法,则系统会在执行该构造方法时默认添加调用父类无参构造方法。

    public ThisClass(){
    
    }
    默认隐式添加父类无参构造方法,相当于
    public ThisClass(){
    	super();
    }
         (2)如果构造方法中在第一条语句调用了本类的重载构造方法,则执行该类的重载构造方法,执行的规则同上。
    public ThisClass(){
    	this(3);
    }	
    public ThisClass(int x){
    	
    }

    当调用ThisClass的无参构造方法时,因其第一句调用本类的重载构造方法,所以程序进入有参的重载方法中执行,有参构造方法符合(1)的情况,所以隐式添加父类的构造方法。

    注:
        (1)显式调用父类的构造方法和调用本类的其他重载构造方法都要求必须放在构造方法的第一条语句,所以同一个构造方法中不能既调用父类的构造方法,又调用本类的其他重载构造方法。Constructor call must be the first statement in a constructor.

     
        (2)子类构造方法中没有显式调用父类构造方法时,系统默认调用父类无参构造方法,而如果父类没有无参构造方法,则出现编译错误。没有定义无参构造方法

    附: 当new一个对象时,代码的执行顺序

    public class Test {
    	public static void main(String[] args) {
    		System.out.println("×××××第一次new B对象×××××");
    		new B();
    		System.out.println("×××××第二次new B对象×××××");
    		new B();
    	}
    }
    
    class A {
    	
    	{
    		System.out.println("父类A的自由块");
    	}
    
    	A() {
    		System.out.println("父类A的构造方法
    ");
    	}
    
    	D d = new D("父类A的成员变量被初始化
    ");
    
    	static {
    		System.out.println("父类A的静态自由块");
    	}
    
    	static D dd = new D("父类A的静态成员变量被初始化
    ");
    }
    
    class B extends A {
    	
    	static D ddd = new D("子类B的静态成员变量被初始化");
    	
    	static {
    		System.out.println("子类B的静态自由块
    ");
    	}
    	
    	D dddd = new D("子类B的成员变量被初始化");
    
    	B() {
    		super();
    		System.out.println("子类B的构造方法");
    	}
    
    	{
    		System.out.println("子类B的自由块
    ");
    	}
    }
    
    class D {
    	D(String str) {
    		System.out.println(str);
     	}
    }

    执行结果:

    ×××××第一次new B对象×××××
    父类A的静态自由块
    父类A的静态成员变量被初始化
    
    子类B的静态成员变量被初始化
    子类B的静态自由块
    
    父类A的自由块
    父类A的成员变量被初始化
    
    父类A的构造方法
    
    子类B的成员变量被初始化
    子类B的自由块
    
    子类B的构造方法
    ×××××第二次new B对象×××××
    父类A的自由块
    父类A的成员变量被初始化
    
    父类A的构造方法
    
    子类B的成员变量被初始化
    子类B的自由块
    
    子类B的构造方法

    作者:tuu 出处:http://www.cnblogs.com/tutuu
  • 相关阅读:
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(2月16日)
    优步UBER司机全国各地奖励政策汇总 (2月15日-2月21日)
    优步UBER司机全国各地奖励政策汇总 (2月8日-2月14日)
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(2月7日~2月13日)
    成都Uber优步司机奖励政策(2月7日)
    file does not exist 阿里云OSS图片上传遇到的问题
    redis.conf 配置项说明
    redis 五大数据类型的常用指令
    redis配置外部访问
    linux安装redis
  • 原文地址:https://www.cnblogs.com/tutuu/p/4131050.html
Copyright © 2011-2022 走看看