package com.heima.day23;
public class Test9 {
/**
* @param args
*/
public static void main(String[] args) {
new Child();
}
}
class bb {
public bb(){
System.out.println("bb");
}
}
class Parent
{
public static int t = parentStaticMethod2();
{
System.out.println("父类非静态初始化块");
}
bb b = new bb();
static
{
System.out.println("父类静态初始化块");
}
public Parent()
{
System.out.println("父类的构造方法");
}
public static int parentStaticMethod()
{
System.out.println("父类类的静态方法");
return 10;
}
public static int parentStaticMethod2()
{
System.out.println("父类的静态方法2");
return 9;
}
}
class Child extends Parent
{
{
System.out.println("子类非静态初始化块");
}
static
{
System.out.println("子类静态初始化块");
}
public Child()
{
System.out.println("子类的构造方法");
}
public static int childStaticMethod()
{
System.out.println("子类的静态方法");
return 1000;
}
}
以下为结果:
父类的静态方法2
父类静态初始化块
子类静态初始化块
父类非静态初始化块
bb
父类的构造方法
子类非静态初始化块
子类的构造方法
程序说明
1,父类优先子类加载 , 加载完毕后加载子类class文件
2,执行子类构造函数之前先对父类对象初始化.父类的初始化为时, 父类属性 构造代码块以在程序位置先后执行(不一定是构造方法之前执行构造代码块)
最后执行构造方法对父类属性进行显示初始化 .
附:
一个网上的说法,感觉很实用,但是第三点与程序执行结果相驳.
我给你一个最全的顺序,按这个顺序去分析: - 类加载过程(静态属性、静态方法声明-----静态属性赋值、静态块)注意先父类后子类
- 实例化过程(普通属性、普通方法声明-----普通属性赋值、构造块----构造方法中的代码)也是先父类后子类
- 如果在类加载过程中调用了实例化过程(如new了本类对象),则会暂停类加载过程先执行实例化过程,执行完毕再回到类加载过程
|
|