Java中类的初始化、实例化对象的顺序

  1. 无论在子类还是在父类中都是先执行静态的,后执行非静态的。(先静态后非静态) 第一优先级。
  2. 在继承关系中,首先进行父类的初始化,后进行子类的初始化。(先父后子) 第二优先级
  3. 无论是静态的代码还是非静态的代码,都是按照:变量的默认初始化->变量的显式初始化->代码块->构造方法     第三优先级
  4. 在执行构造方法时总是先执行父类的构造方法(若未指明调用父类的哪一个构造方法,默认调用无参的构造方法),后执行子类构造方法中的代码。   第四优先级
  5. 注意点:只有实例化时,才会执行非静态代码。

总结顺序:

父类中的静态变量的默认初始化->父类中的静态变量的显式初始化->父类中的静态代码块->

子类中的静态变量的默认初始化->子类中的静态变量的显式初始化->子类中的静态代码块-> 

父类中的非静态变量的默认初始化->父类中的非静态变量的显式初始化->父类中的构造代码块->父类中的构造方法 ->

子类中的非静态变量的默认初始化->子类中的非静态变量的显式初始化->子类中的构造代码块->子类中的构造方法

案例1:

package 实验;

class Fu {
	
	public static int num1 = method(); //后显式初始化
	int num2; //先默认初始化,默认值为0

	public Fu() {
		System.out.println("Fu中的构造方法");
	}
	
	static { //静态代码块
	    System.out.println("Fu类中的静态代码块");
	}
	
	{//构造代码块
    	 System.out.println("Fu类中的构造代码块");
    }
	 
	public static int method() {
		System.out.println("Fu类中的method()方法");
		return 10;
	}
}

class Zi extends Fu {
	public static int num1 = method(); //后显式初始化
	int num2; //先默认初始化,默认值为0
	
	public Zi() {
	   	super();
		System.out.println("Zi中的构造方法");
	}
	
    static { //静态代码块
	    System.out.println("Zi类中的静态代码块");
	}
    
    {//构造代码块
    	 System.out.println("Zi类中的构造代码块");
    }
    public static int method() {
		System.out.println("Zi类中的method()方法");
		return 10;
	}
}

public class Demo {
	public static void main(String[] args) {
		Zi z=new Zi();
	}
}

运行结果如下图:

案例2:

package 实验;

class X {
	Y b = new Y();
	
	X() {
		System.out.println("X类的构造方法");
	}
}

class Y {
	Y() {
		System.out.println("Y类的构造方法");
	}
}

class Z extends X {
	Y y = new Y();
	
	Z() { //默认调用父类的无参构造方法
		System.out.println("Z类的构造方法");
	}
}

public class Demo{
	public static void main(String[] args) {
		new Z(); //先父类后子类
	}
}

运行结果如下图:

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值