浅谈Java中父类与子类的加载顺序详解
程序员文章站
2023-12-18 13:02:04
复制代码 代码如下:class parent { // 静态变量 public static str...
复制代码 代码如下:
class parent {
// 静态变量
public static string p_staticfield = "父类--静态变量";
// 变量(其实这用对象更好能体同这一点,如专门写一个类的实例)
//如果这个变量放在初始化块的后面,是会报错的,因为你根本没有被初始化
public string p_field = "父类--变量";
// 静态初始化块
static {
system.out.println(p_staticfield);
system.out.println("父类--静态初始化块");
}
// 初始化块
{
system.out.println(p_field);
system.out.println("父类--初始化块");
}
// 构造器
public parent() {
system.out.println("父类--构造器");
}
}
public class subclass extends parent {
// 静态变量
public static string s_staticfield = "子类--静态变量";
// 变量
public string s_field = "子类--变量";
// 静态初始化块
static {
system.out.println(s_staticfield);
system.out.println("子类--静态初始化块");
}
// 初始化块
{
system.out.println(s_field);
system.out.println("子类--初始化块");
}
// 构造器
public subclass() {
//super();
system.out.println("子类--构造器");
}
// 程序入口
public static void main(string[] args) {
system.out.println("*************in main***************");
new subclass();
system.out.println("*************second subclass***************");
new subclass();
}
}
输出结果
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
*************in main***************
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
*************second subclass***************
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
结果分析:
很显然在加载main方法后,静态变量不管父类还是子类的都执行了,然后才是父类和子类的的普通变量和构造器。这是因为,当要创建子类这个对象时,发现这个类需要一个父类,所以把父类的.class加载进来,然后依次初始化其普通变量和初始化代码块,最后其构造器,然后可以开始子类的工作,把子类的.class加载进来,在做子类的工作。
另外在java中子类中都会有默认的调用父类的默认构造函数即super(),当仅仅有默认构造函数里
java替你做了,我们可以做个实验,如果在父类中注释掉默认构造函数,加一个有参的构造函数时,如果
子类中不加super(argument),此时会报语法错误
如果我们把main方法中的内容全注释掉,你会发现只会输出
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
其它不会输出了。原因呢? 还要研究