JVM 类的加载(四)- 父类子类加载关系

子类与父类的在类的启动时,遵循父类先加载,子类后加载的规则,常会用作于坑爹笔试题。下面看代码解释。 有两个类 Parent 和 Child,Child extend Parent。

public class Parent
{
	public static int parent;
	static
	{
		System.out.println("This is Parent");
	}
}
public class Child extends Parent
{
	public static int child;
	static
	{
		System.out.println("This is Child");
	}
}

接下来,我们写一个Test测试类来测试这父子类的加载顺序

public class Test {
    public static void main(String[] args) {
        System.out.println(Child.child);
    }
}

我们来输出Child里的child变量,结果为

This is Parent

This is Child

0

由此可看出,在访问Child里的静态成员变量child的时候,会引起类的加载,同时,子类加载之前,父类会先于子类加载。所以先输出父类结果,其次子类,最后自己的成员变量

紧接着,我们再写一个Test类来访问父类

public class Test {
    public static void main(String[] args) {
        System.out.println(Parent.parent);
    }
}

结果为

This is Parent

0

由此可见,在加载父类的时候,子类不会被加载。这个比较容易理解,因为所有的对象的父类都是object,如果你加载object时,子类也加载了,那程序岂不是要崩溃。。。

最后,再用下面的写法再做一个测试,用子类去访问父类的静态成员变量

public class Test {
    public static void main(String[] args) {
        System.out.println(Child.parent);
    }
}

结果为

This is Parent

0

子类还是没有被调用,这是为什么呢,这里需要注意,虽然使用了Child的类,但并没有访问Child的静态成员变量,所以不会引起Child类的加载,而父类Parent的静态成员变量被访问了,所以父类会加载。 结果就为上。

转载于:https://my.oschina.net/u/1273644/blog/777614

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值