java中继承的内存分析
本文主要讲述java中继承的内存分析。
示例1,代码如下:
public class EncapsulationTest { public static void main(String[] args) { Son son = new Son(); System.out.println(son.name); System.out.println(son.age); System.out.println(son.hobby); } } class GrandFa { String name = "爷爷"; String hobby = "喝茶"; } class Father extends GrandFa{ String name = "爸爸"; int age = 22; } class Son extends Father{ String name = "儿子"; }
jvm继承的内存图如下:
运行结果:
示例2,代码如下:
public class EncapsulationTest { public static void main(String[] args) { Son son = new Son(); } } class GrandFa { String name = "爷爷"; String hobby = "喝茶"; } class Father extends GrandFa{ String name = "爸爸"; int age = 22; // public Father (){ // System.out.println("Father()无参构造方法"); // } public Father(String name,int age){ System.out.println("Father(String name,int age)构造方法"); } } class Son extends Father{ String name = "儿子"; public Son (){ // 默认是父类的无参构造方法,如果父类没有无参构造方法, // 则需要在子类的构造器中,第一行使用super()指定使用父类的构造器。 super("jack",45); } }
运行结果:
注意细节:
① 方法区中先加载完父类,再加载子类。
② 父类与子类中相同名称的成员变量分配在不同的存储空间中。
③ 访问某属性时,如果该属性在当前类中,且能够访问,则直接访问;否则,使用get()方法访问,如果当前类中没有该属性,则在其父类中查找该属性。
④ 子类构造器,默认执行父类的无参构造器即super(),可以省略,如果没有父类的无参构造器,则需要在super()中指明父类的构造器,super()必须是在第一行。