JAVA的初始化顺序
2015-10-21 14:59
399 查看
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"); } }
[align=left]//运行结果[/align]
[align=left]Base static block[/align]
[align=left]de static block[/align]
[align=left]base block[/align]
[align=left]base constructor[/align]
[align=left]de block[/align]
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
相关文章推荐
- java中父类和子类初始化顺序
- Java初始化顺序
- Java程序的初始化顺序
- 类的初始化顺序(二)
- Java初始化规则都不懂,搞什么开发!
- java类初始化中类成员的执行顺序解析
- Java_多线程下的生产者与消费者实现
- 28个Java常用的工具类
- java.util.ConcurrentModificationException的解决办法
- struts2标签详解
- java学习日记(非技术贴)
- struts2标签详解
- JAVA中List、Map、Set的区别与选用
- java 键盘输入多种方法
- 序列化和反序列化
- Java_管道流实现
- Java_Properties类实现软件使用次数
- struts2标签取值方式
- 从头认识java-2.1 操作符
- java加密技术(十一) 认证相关