1、ParentClass.java
package test17;
public class ParentClass {
static int aa = 3;
private int bb = 10;
static {
System.out.println("父类中的静态代码块");
}
public ParentClass() {
System.out.println("父类中的构造函数");
}
private void fun() {
System.out.println("ParentClass aa===>" + aa + " bb===>" + bb);
}
}
2、SonClass.java
package test17;
public class SonClass extends ParentClass {
static int aa = 3;
private int bb = 10;
static {
System.out.println("子类中的静态代码块");
}
public SonClass() {
System.out.println("子类中的构造函数");
}
protected void fun() {
System.out.println("SonClass aa===>" + aa + " bb===>" + bb);
}
}
3、Test.java
package test17;
public class Test {
public static void main(String[] args) {
SonClass sonClass = new SonClass();
sonClass.fun();
}
}
运行结果:
父类中的静态代码块
子类中的静态代码块
父类中的构造函数
子类中的构造函数
SonClass aa===>3 bb===>10
类加载顺序:
(1) 父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法)
(2) 子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法 )
(3) 父类非静态代码块( 包括非静态初始化块,非静态属性 )
(4) 父类构造函数
(5) 子类非静态代码块 ( 包括非静态初始化块,非静态属性 )
(6) 子类构造函数
package test17;
public class Base {
private String baseName = "base";
public Base() {
System.out.println("父类的构造函数");
callName();
}
public void callName() {
System.out.println("父类的callName()方法===>" + baseName);
}
}
package test17;
public class Sub extends Base {
private String baseName = "sub";
public Sub() {
System.out.println("子类的构造函数");
}
public void callName() {
System.out.println("子类的callName()方法===>" + baseName);
}
}
package test17;
public class Test {
public static void main(String[] args) {
Base b = new Sub();//b编译时表现为Base类特性,运行时表现为Sub类特性。
}
}
运行结果:
父类的构造函数
子类的callName()方法===>null
子类的构造函数