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
  • 相关阅读:
    Database mirroring connection error 4 'An error occurred while receiving data: '10054(An existing connection was forcibly closed by the remote host.)
    [转载]——Automatic Tuning of Undo_retention Causes Space Problems (文档 ID 420525.1)
    [转载]——Full UNDO Tablespace In 10gR2 and above (文档 ID 413732.1)
    SQL Server Agent作业执行CmdExec(bat)命令报权限问题
    SQL Server有意思的数据类型隐式转换问题
    pymssql的Connection相关特性浅析
    pymssql默认关闭自动模式开启事务行为浅析
    Azure上MySQL的离线备份:将备份拷贝到Azure Blob上
    crontab中部署Python脚本注意事项
    TypeError: expected string or bytes-like object
  • 原文地址:https://www.cnblogs.com/tutuu/p/4131050.html
Copyright © 2011-2022 走看看