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的初始化中,顺序是(父类静态变量,父类静态代码块)-->(子类静态变量,之类静态代码块)-->(父类非静态变量,父类非静态代码块)-->父类构造器-->(子类非静态变量,子类非静态代码块)-->子类构造器
其中,静态代码块的执行顺和静态变量的执行顺序于他们在代码的排列顺序有关,谁在前面就先执行,例子如下
结果是
执行非静态的初始化代码块
cat constructor
Cat [name=kitty, age=2, weight=2.3]
把double变量和非静态代码块位置掉换之后是:
执行非静态的初始化代码块
cat constructor
Cat [name=kitty, age=2, weight=2.0]
在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中类初始化的顺序,包括静态变量、静态代码块、非静态变量、非静态代码块及构造器的执行流程。通过实例展示了不同元素在类加载过程中的执行顺序及其对对象创建的影响。
542

被折叠的 条评论
为什么被折叠?



