您的位置:首页 > 编程语言 > Java开发

Java中创建一个子类对象会不会创建父类对象?

2017-06-06 22:23 676 查看
答案是否定的,在Java中创建一个子类对象是不会创建父类对象的。

通过一个实例来证明:

实例:

父类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;
}
}


子类Sub.java

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


测试类Test.java

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


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

Base()

test01.Sub@1896d2c2

Sub()

test01.Sub@1896d2c2

SubString

结论:

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

思考:

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

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

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

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

内存图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 继承
相关文章推荐