JAVA的初始化顺序

package test;

public class TestInit
{
	public static void main(String[] args)
	{
		new Dervied();
	}
}

class Base
{
	static
	{
		System.out.println("Base static block");
	}
	{
		System.out.println("base block");
	}

	public Base()
	{
		// TODO Auto-generated constructor stub
		System.out.println("base constructor");
	}

}

class Dervied extends Base
{
	static
	{
		System.out.println("de static block");
	}

	{
		System.out.println("de block");
	}

	public Dervied()
	{
		// TODO Auto-generated constructor stub
		System.out.println("de constructor");
	}

}


//运行结果
Base static block
de static block
base block
base constructor
de block
de constructor

在JAVA的初始化中,顺序是(父类静态变量,父类静态代码块)-->(子类静态变量,之类静态代码块)-->(父类非静态变量,父类非静态代码块)-->父类构造器-->(子类非静态变量,子类非静态代码块)-->子类构造器
其中,静态代码块的执行顺和静态变量的执行顺序于他们在代码的排列顺序有关,谁在前面就先执行,例子如下

package test;

public class TestInitDemo
{
	public static void main(String[] args)
	{
		Cat cat = new Cat("kitty", 2);
		System.out.println(cat);
	}
}

class Cat
{
	String name;
	int age;

	public Cat(String name, int age)
	{
		System.out.println("cat constructor");
		this.name = name;
		this.age = age;
	}

	{
		System.out.println("执行非静态的初始化代码块");
		weight = 2.0;
	}
	double weight = 2.3;

	@Override
  public String toString()
  {
	  return "Cat [name=" + name + ", age=" + age + ", weight=" + weight + "]";
  }

}

结果是
执行非静态的初始化代码块
cat constructor
Cat [name=kitty, age=2, weight=2.3]

把double变量和非静态代码块位置掉换之后是:
执行非静态的初始化代码块
cat constructor
Cat [name=kitty, age=2, weight=2.0]


原因:比如定义一个 int a = 1;他的执行顺序是,int a创建一个Java对象为该对象分配内存,a = 1,提取到JAVA类的构造器之前执行


静态变量和静态代码块为某一个静态变量初始化也是:看谁在代码的前面就是先执行。

package test;

public class PriceTest
{
      public static void main(String[] args)
      {
            System. out.println(Prince. INISTANCE. currentPrice);
            Prince p = new Prince(2.8);
            System. out.println( p. currentPrice);
      }
}

class Prince
{
      final static Prince INISTANCE = new Prince(2.8);
      static double initPrice = 20;
      double currentPrice;

      public Prince( double discount)
      {
             // TODO Auto-generated constructor stub
             this. currentPrice = initPrice - discount;
      }
}

//结果是
-2.8
17.2

原因:代码顺序当中,是先有Prince对象,再到initPrice,在初始化完成了INISTANCE 再去初始化initPrice,而在初始化INISTANCE的时候,initPrice的值是0.0(默认值,不算是初始化),然后得到的currentPrice的值是就是-2.8了,然后第二个,这时候已经为initPrice初始化了,所以是17.2

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值