即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

Java语言里创建一个子类对象会不会创建父类对象?

编程语言 qq_27760433 105℃ 0评论
本文目录
[隐藏]

答案是否定的,在Java中创建一个子类对象是不会创建父类对象的。


通过一个实例来证明:

1.实例:

1.1.父类Base.java

public class Base {
    private String str;

    public Base() {
        System.out.println("Base()");
        System.out.println(this);
    }

    public void setStr(String str) {
        this.str = str;
    }

    public String getStr() {
        return this.str;
    }
}

1.2.子类Sub.java

public class Sub extends Base {
    public Sub() {
        System.out.println("Sub()");
        System.out.println(this);
    }
}

1.3.测试类Test.java

public class Test {
    public static void main(String[] args) {
        Sub sub = new Sub();
        sub.setStr("SubString");
        System.out.println(sub.getStr());
    }
}

1.4.一次运行程序输出的结果:


Base()


test01.Sub@1896d2c2


Sub()


test01.Sub@1896d2c2


SubString


1.5.结论:

由输出结果可见,当创建子类对象时首先调用了父类的构造方法,再调用子类的构造方法,值得注意的是传给父类构造方法的this指针和传给子类构造方法的this指针完全相同,也就是说调用父类构造方法的并不是父类的对象,所以在创建子类对象时并没有创建父类对象。

1.6.思考:

子类对象使用的父类中私有属性被放在哪里?

在本例中,父类有一个私有属性String str,既然没有创建父类对象,那么子类通过get和set使用的属性是哪里来的?


当创建子类对象Sub时,如果父类对象Base中有私有属性,系统会在堆区中开辟一块空间来保存这个私有属性(该空间不属于子类对象),并且在运行时该属性的空间会与方法区中Base.class动态绑定。


子类对象sub调用继承父类的方法setStr()时,系统会找到与setStr()方法静态绑定的类Base,在找到与Base类动态绑定的属性空间str,便可对该属性进行相关操作。


1.7.内存图内存图

转载请注明:CodingBlog » Java语言里创建一个子类对象会不会创建父类对象?

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情