Java中创建一个子类对象会不会创建父类对象?
2017-06-06 22:23
676 查看
答案是否定的,在Java中创建一个子类对象是不会创建父类对象的。
通过一个实例来证明:
test01.Sub@1896d2c2
Sub()
test01.Sub@1896d2c2
SubString
在本例中,父类有一个私有属性String str,既然没有创建父类对象,那么子类通过get和set使用的属性是哪里来的?
当创建子类对象Sub时,如果父类对象Base中有私有属性,系统会在堆区中开辟一块空间来保存这个私有属性(该空间不属于子类对象),并且在运行时该属性的空间会与方法区中Base.class动态绑定。
子类对象sub调用继承父类的方法setStr()时,系统会找到与setStr()方法静态绑定的类Base,在找到与Base类动态绑定的属性空间str,便可对该属性进行相关操作。
内存图
通过一个实例来证明:
实例:
父类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创建一个子类对象是会调用父类的构造方法会不会创建父类
- java创建一个子类对象是会调用父类的构造方法会不会创建父类
- java创建一个子类对象是会调用父类的构造方法会不会创建父类
- java程序练习:尝试创建一个父类,在父类中创建两个方法,在子类中覆盖第二个方法,为子类创建一个对象,将他向上转型到基类并调用这个方法。
- 创建一个子类对象会不会创建父类对象?
- java中创建子类对象时会不会创建父类对象
- java中创建子类对象时总是会先创建其父类对象
- Head First Java: 怎么判断你需要创建一个父类、子类、抽象类还是接口
- 关于理解Java中的多态性,父类引用创建子类对象
- [ java ] java语言中的子类对象和父类对象的创建过程!
- 在java中怎么理解“用instanceof操作符判断父类对象是否为子类的一个实例”?
- Java子类对象中必有一个父类对象2
- java中,创建子类对象时,父类对象会也被一起创建么?
- 尝试创建一个父类和子类,分别创建一个构造方法,然后向父类和子类添加成员变量和方法,并总结构造子类对象时的顺序。
- Java继承:子类和父类创建对象的顺序问题。
- java语言中的子类对象和父类对象的创建过程!
- 尝试创建一个父类,在父类中创建两个方法,在子类中覆盖第二个方法,为子类创建一个对象,将它向上转型到基类并调用这个方法。
- JAVA中关于new子类对象时是否创建父类
- java继承,多态方面的一个问题,定义一个父类对象,用子类new
- Java多态性详解——父类引用子类对象-理解-1