关于Java父类的私有成员是否会被继承

答案

不会

出发

可以查看oracle出的关于Java的解释文件https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2

这里写的已经是相当明白了,私有变量,不会继承。

问题

可是子类确实通过调用父类的方法,访问到了私有成员,而且,子类调用在父类方法中的this.getClass(),得到的就是子类。难道私有成员也被继承了?oracle的开发文档写错了?

我不这么认为,很多人都通过反射的方法获取过父类的私有成员,可是谁是用子类本身获取的?没有。都是通过子类得到父类,再通过父类得到相关的私有成员。私有成员是否被继承,显然没有这么简单。

结论

在这篇博客https://blog.csdn.net/qq_27760433/article/details/72889104,我发现了一个让我很赞同的解释。

子类的创建并不会导致父类被创建,创建对象的本质,也不过是给一个对象在堆内存中开扩一个空间,而构造器的作用,是在对象创建完成(这一点,我不认为应该是初始化阶段,初始化阶段应该是为注入默认初始值保证没有赋予值,也能正常使用)之后阶段,并不是在分配空间的阶段。

每次创建子类时,会将父类的私有变量单独存放到一个动态链接父类的堆内存中,父类对象并不存在,然后将父类构造器放入子类构造器前方,依次执行。父类的private成员和其他成员并不在一起。子类通过父类方法访问动态绑定的私有成员。

这样就能解释上面的问题,父类对象并不存在,所以this.getClass()也只能得到子类信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值