子类继承父类之后,实例化子类后,父类中的私有成员会存在于子类对象的内存中么?

明月镇魂 2016-07-16 11:48:00
JAVA官方文档明确指出:子类无法继承父类中的私有属性以及私有方法。
但是以下代码:

public class ExtendsDemo02 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 验证子类能否访问父类中的private属性或者方法
// 或者说继承?
child ch = new child();
ch.setage(10);
ch.name = "xiaomim";
System.out.println(ch);
System.out.println(ch.getage());

}

}

class person_private {
private int age;
String name;

public void setage(int age) {
this.age = age;
}

public int getage() {
System.out.println(this);
return this.age;
}

}

class child extends person_private {
void cry() {
System.out.println("wowo");
}
}


其运行结果为:

child@55f33675
child@55f33675
10


也就是说this和ch指向同一个对象,这个现象是不是说明在子类对象的内存中存在父类的私有成员(或者说为父类私有成员开辟了空间)?如果不存在,那么父类的私有属性存放在哪里呢?
...全文
502 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_35723550 2016-07-27
  • 打赏
  • 举报
回复
我在想子类继承了父类的getage方法,但是子类没有继承父类的age,是怎么用子类对象的引用取出父类的age
狂暴的小猴儿 2016-07-18
  • 打赏
  • 举报
回复 1
父类中的this 表示实际调用此方法的对象 和你main方法的ch是一个东西 这个就是多态 在类加载过程中不会实例化父类对象 但是会在子类的堆内存中为父类的成员变量分配内存空间 但是私有属性是访问不到的 可以通过父类暴露出来的get方法访问
qq_15915835 2016-07-18
  • 打赏
  • 举报
回复
http://blog.chinaunix.net/uid-24876683-id-5076132.html
qq_35623620 2016-07-18
  • 打赏
  • 举报
回复
我也刚学,我感觉继承就有, 私有就是保护不被串改,只能给你用。
bree06 2016-07-17
  • 打赏
  • 举报
回复
private,protected,默认,public,是限制方法或属性的访问权限,public int getage() {}是可以被继承的,new child();实例化后相当于child类也有getage()方法,此时的this就是child的实例。 还有new child()之后在内存中只会有一份对象实例那就是child实例,不存在一份父对象实例,一份子对象实例。实例化子对象的时候会先实例化父对象(父类自己当然能够实例化自己的private属性)。所以父类中的私有成员会存在于子类对象的内存中,只是子类无法直接访问private修饰的父属性的方法。
明月镇魂 2016-07-17
  • 打赏
  • 举报
回复
引用 4 楼 Mailbomb 的回复:
私有属性是占内存的
能请您稍微讲解一下么?
明月镇魂 2016-07-17
  • 打赏
  • 举报
回复
引用 1 楼 bree06 的回复:
private,protected,默认,public,是限制方法或属性的访问权限,public int getage() {}是可以被继承的,new child();实例化后相当于child类也有getage()方法,此时的this就是child的实例。 还有new child()之后在内存中只会有一份对象实例那就是child实例,不存在一份父对象实例,一份子对象实例。实例化子对象的时候会先实例化父对象(父类自己当然能够实例化自己的private属性)。所以父类中的私有成员会存在于子类对象的内存中,只是子类无法直接访问private修饰的父属性的方法。
您的意思是指在子类对象的内存中包含了一个父类对象么?
网络咖啡 2016-07-17
  • 打赏
  • 举报
回复
私有属性是占内存的
明月镇魂 2016-07-17
  • 打赏
  • 举报
回复
引用 1 楼 bree06 的回复:
private,protected,默认,public,是限制方法或属性的访问权限,public int getage() {}是可以被继承的,new child();实例化后相当于child类也有getage()方法,此时的this就是child的实例。 还有new child()之后在内存中只会有一份对象实例那就是child实例,不存在一份父对象实例,一份子对象实例。实例化子对象的时候会先实例化父对象(父类自己当然能够实例化自己的private属性)。所以父类中的私有成员会存在于子类对象的内存中,只是子类无法直接访问private修饰的父属性的方法。
“实例化子对象的时候会先实例化父对象(父类自己当然能够实例化自己的private属性)。所以父类中的私有成员会存在于子类对象的内存中,只是子类无法直接访问private修饰的父属性的方法。” 这句话中"实例化子对象的时候会先实例化父对象"与“父类中的私有成员会存在于子类对象的内存中”有何种联系?
Be_nurturing 2016-07-17
  • 打赏
  • 举报
回复
编译时子类是访问不到父类的年龄的属性,只是可以调用父类的public void setAge()方法。你可以试下,用ch.age的时候是访问不到父类的年龄的属性的。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧