java中的代码初始化顺序

对象初始化时,代码的运行状态

<pre name="code" class="java">import java.util.*;

public class Dog {

	static {
		System.out.println("【静态代码块】dog");
	}

	public Dog() {
		System.out.println("【构造方法】dog()");
	}

	static void dogStaticMethod() {
		System.out.println("【静态方法】dog");
	}
      //!Dog dog2=new Dog(); //(位置3)  
	 /* 说明:位置3在本类成员变量区域new本类对象,当该类new对象时会发生java.lang.StackOverflowError 异常
	   ,静态的就没问题 For Example:static Dog dog2=new Dog();*/
	
	public static void main(String[] args) {
		System.out.println("Creating new Cat() in main");
		new Cat();
		System.out.println("Creating new Cat() in main");
		new Cat();
		// table.f2(1);
		cat.catMethod(1);
		Cat.catStaticMethod();
		Dog dog = new Dog(); // (位置1)
		/*
		 * 位置1:new 本类对象,会初始化本类中的所有成员(不包括本类对象,如位置3)(如果静态成员变量已经运行过,
		 * 就不会再运行第二次了),构造代码块与非静态成员变量按代码先后顺序依次执行且 都要比构造方法先执行;
		 */
	}
	
	Table table = new Table(); // 位置2 ,可以将这句代码剪切到构造代码块前验证执行顺序
	static Cat cat = new Cat();
	{
		System.out.println("【构造代码块】dog");
	}
}

class Bowl {
	Bowl(int marker) {
		System.out.println("【构造方法】Bowl(" + marker + ")");
	}

	void bowlMethod(int marker) {
		System.out.println("【非静态方法】Bowl(" + marker + ")");
	}

	{
		System.out.println("【构造代码块】bowl");
	}
	static {
		System.out.println("【静态代码块】Bowl");
	}
}

class Table {
	
	static Bowl bowl1 = new Bowl(1);

	Table() {
		System.out.println("【构造方法】Table()");
		bowl2.bowlMethod(1);
	}

	void tableMethod(int marker) {
		System.out.println("【非静态方法】Table方法(" + marker + ")");
	}

	static Bowl bowl2 = new Bowl(2);
}

class Cat {
	// ! static Cat A=new Cat(); //位置4:改对象调用构造方法时,方法中bowl4对象未进行初始化,会报出空指针异常;放到位置5之后就可以了;
	Bowl bowl3 = new Bowl(3);
	static Bowl bowl4 = new Bowl(4); //位置5

	Cat() {
		System.out.println("【构造方法】Cat()");
		bowl4.bowlMethod(2);
	}

	void catMethod(int marker) {
		System.out.println("【非静态方法】Cat方法(" + marker + ")");
	}

	static Bowl bowl5 = new Bowl(5);

	static void catStaticMethod() {
		System.out.println("【静态方法】Cat");
	}

	static {
		System.out.println("【静态代码块】Cat");
	}
	{
		System.out.println("【构造代码块】Cat");
	}
}
 
/* Output:
【静态代码块】dog
【静态代码块】Bowl
【构造代码块】bowl
【构造方法】Bowl(4)
【构造代码块】bowl
【构造方法】Bowl(5)
【静态代码块】Cat
【构造代码块】bowl
【构造方法】Bowl(3)
【构造代码块】Cat
【构造方法】Cat()
【非静态方法】Bowl(2)
Creating new Cat() in main
【构造代码块】bowl
【构造方法】Bowl(3)
【构造代码块】Cat
【构造方法】Cat()
【非静态方法】Bowl(2)
Creating new Cat() in main
【构造代码块】bowl
【构造方法】Bowl(3)
【构造代码块】Cat
【构造方法】Cat()
【非静态方法】Bowl(2)
【非静态方法】Cat方法(1)
【静态方法】Cat
【构造代码块】bowl
【构造方法】Bowl(1)
【构造代码块】bowl
【构造方法】Bowl(2)
【构造方法】Table()
【非静态方法】Bowl(1)
【构造代码块】dog
【构造方法】dog()
*/


 

 /*初始化过程(代码运行方式:从上到下):
 一、含main方法的主类
 1、首先静态的代码块及静态的成员变量按代码的先后顺序依次执行且只执行一次;
 2、然后执行main方法内的代码;
 注意:1、非静态成员变量不执行,除非在其他方法内或其他类中new了该类的对象;
       2、如果在本类成员变量区new 本类对象(非静态),代码不执行,如果执行就会报错java.lang.StackOverflowError,
          如果定义为静态的,就不会报错,在该类加载的时候就已经运行了;
       3、在main方法内new本类对象,可以执行;
          构造代码块随着new 本类对象发生调用构造方法前执行;
          静态方法及非静态方法只有在被调用的时候才会被执行;
 二、在主类中通过new 对象的方式调用其他类(加载其他类),其他类内代码的运行过程
 1、首先静态的代码块及静态的成员变量按代码的先后顺序依次执行且只执行一次;
 2、静态的执行完成后,然后执行非静态成员变量的初始化;(因为对象包含该成员变量)
  注意: 1、构造代码块随着new 本类对象发生调用构造方法前执行;
         2、构造代码块与非静态的成员变量按代码先后顺序执行;
         3、如果在本类成员变量区new 本类对象(非静态),代码不执行,如果执行就会报错java.lang.StackOverflowError,
          如果定义为静态的,就不会报错,在该类加载的时候就已经运行了;
         重点注意:对象的使用一定要保证该对象已经完成初始化,如位置4;

*/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值