测试代码如下:
package cn.guoxj.test;
/**
* @author guoxjcn
* PersonClass是父类
*
*/
class PersonClass {
//类变量
public static String staticMethodValue=classVariableValue();
//成员变量
public String memberVariableValue = memberVariableValue();
//静态代码块
static{
System.out.println("我是PersonClass静态代码块---------------->Person");
}
//代码块
{
System.out.println("我是PersonClass代码块---------------->Person");
}
//构造器
public PersonClass(){
System.out.println("我是PersonClass构造器---------------->Person");
}
//成员变量的值
public String memberVariableValue(){
System.out.println("我是PersonClass的memberVariableValue---------------->Person");
return memberVariableValue;
}
//类变量的值
public static String classVariableValue(){
System.out.println("我是PersonClass的staticMethodValue---------------->Person");
return staticMethodValue;
}
//静态方法的值
public static void staticMethod(){
System.out.println("我是PersonClass的staticMethod方法---------------->Person");
}
}
----------------------------------------------------------------------------------------------------------------------
package cn.guoxj.test;
/**
* @author guoxjcn
* ChildClass是PersonClass的子类
*/
public class ChildClass extends PersonClass{
//类变量
public static String staticMethodValue=classVariableValue();
//成员变量
public String memberVariableValue = memberVariableValue();
//静态代码块
static{
System.out.println("我是ChildClass静态代码块---------------->Child");
}
//代码块
{
System.out.println("我是ChildClass代码块---------------->Child");
}
//构造器
public ChildClass(){
System.out.println("我是ChildClass构造器---------------->Child");
}
//成员变量的值
public String memberVariableValue(){
System.out.println("我是ChildClass的memberVariableValue---------------->Child");
return memberVariableValue;
}
//类变量的值
public static String classVariableValue(){
System.out.println("我是ChildClass的staticMethodValue---------------->Child");
return staticMethodValue;
}
//静态方法的值
public static void staticMethod(){
System.out.println("我是ChildClass的staticMethod方法---------------->Child");
}
public void saying(){
System.out.println("一切OK!");
}
}
---------------------------------------------------------------------------------------------------------------------------
package cn.guoxj.test;
public class LoadTest {
/**
* 测试父类与子类的加载顺利
*/
public static void main(String[] args) {
ChildClass childClass=new ChildClass();
childClass.saying();
}
}
------------------------------------------------------------------------------------------------------------------------------
测试结果:
我是PersonClass的staticMethodValue---------------->Person
我是PersonClass静态代码块---------------->Person
我是ChildClass的staticMethodValue---------------->Child
我是ChildClass静态代码块---------------->Child
我是ChildClass的memberVariableValue---------------->Child
我是PersonClass代码块---------------->Person
我是PersonClass构造器---------------->Person
我是ChildClass的memberVariableValue---------------->Child
我是ChildClass代码块---------------->Child
我是ChildClass构造器---------------->Child
一切OK!
说明:
父类静态变量->
类静态代码块->
子类静态变量->
子类静态代码块->
子类的成员变量->
父类的代码块->
父类的构造器->
子类的代码块->
子类的构造器
===其它见解:=====
JVM在对类初始化时调用了JVM内部的方法 和 . 是对类的类成员和
和静态语句块进行初始化(static部分);而 是对实例变量和一般语句块进行初始化的.
类在初始化时会把类变量(有static修饰的变量)静态语句块(static{ code })放在第一位,其次是一般语句块({ code }),然后再是构造函数,构造函数会去初始化类的一般成员变量.如果有继承关系的话,当然是先父类先初始化,
详细过程如下: a 父类静态成员和静态初始化块 b 子类静态成员和静态初始化块 c 父类实例成员和实例初始化块 d 父类构造方法 e 子类实例成员和实例初始化块 f 子类构造方法