private 属性到底能不能被子类继承?

zgh_remond 2005-07-04 09:50:07
这个问题可能看起来很简单,但我找了许多书,给出的答案都很模糊,在这里要听听高人的看法。
子类可以继承通过父类的public 方法 访问private属性,这是否也意味着private属性能被继承。
...全文
7669 56 打赏 收藏 转发到动态 举报
写回复
用AI写文章
56 条回复
切换为时间正序
请发表友善的回复…
发表回复
Preamble 2005-07-07
  • 打赏
  • 举报
回复
什么叫继承?
我想听听大家说!

面向对象思想与 语言的实现,有直接关系吗?

在实现上,子类拥有父类的一切。但从面向对象说,这不并是说子类继承了父类。而仅仅是java的一种实现

这就好比java是单根Object,可是面向对象的理论中是由多重继承的。这又怎么解释?




同意 回复人: qybao(阿宝) ( ) 信誉:100
chuanyuan88 2005-07-07
  • 打赏
  • 举报
回复 2
在我看来, 子类继承父类的一切东西. <Thinking in JAVA>中说到, 子类对象拥有父类对象的完整拷贝. 实例化一个类是从最顶级的超类开始实例化的, 是一层一层的包裹结构. private限制访问方式只能在类的内部, 这仅仅是一个访问控制, 实际上子类对象拥有父类对象的一切.

个人同意这样的观点
midthinker 2005-07-07
  • 打赏
  • 举报
回复
问题是我们需要如此在乎内在的实现吗?
对于我们来说使用JAVA编程就好象是使用一种约定俗成的规范构造程序一样,我们更在乎的应该是应用域的问题,其次是解决域的问题,至于语言底层的实现机制是如何的似乎并不那么重要。
重要的是,我们知道面向对象中关于继承的机制与规范,至于C++是如何实现的,JAVA是如何实现的,交给语言学家就可以了(或者感兴趣的人们也可以尝试成为该领域的专家)。另外如果我们依然要讨论面向对象是什么?继承又是什么?依我看还是交给哲学家去争论吧。。。
HOHO~~~
@.@||~
dugumu 2005-07-06
  • 打赏
  • 举报
回复
不能。任意一个类A都可以通过另一个类B的public 函数访问B的private数据。
Jokehan 2005-07-06
  • 打赏
  • 举报
回复
子类调用父类的构造函数是为了初始化被子类继承下来的“所有数据成员(难道private成员就不是了??)”,而不是去为了创建一个父类对象而调用的,如果按照有些朋友所说的“dyh506(浪) 的答案很正确,子类里有一个完整的父类。”,那如果我所继承的父类是一个抽象类,试问怎么产生此父类的实例??:)
说好不能打脸 2005-07-06
  • 打赏
  • 举报
回复
不能,但可以通过get、set方式访问
Jokehan 2005-07-06
  • 打赏
  • 举报
回复
楼楼上的Dan1980(也该有一些作为了)兄基本说对:)
Jokehan 2005-07-06
  • 打赏
  • 举报
回复
呵呵,楼上两位先去把TIJ第六章的继承这节熟读搞懂吧:)
Dan1980 2005-07-06
  • 打赏
  • 举报
回复
这个问题没必要再讨论了, 楼主可以结贴了. 我举个例子:

public class Ball {
private int radius;
public Ball(radius) {
this.radius = radius;
}
public int getRadius() {
return radius;
}
}

class BasketBall extends Ball {
BasketBall(radius) {
super(radius);
}
}

篮球继承了球, 半径属性是球私有的, 难道说篮球没有半径属性, 从现实世界的角度来看, 显然有!!!

而从程序逻辑上看, 也是有的:

如果你说, 因为不能用new BasketBall(10).radius这种方法来访问radius的值, 就说明BasketBall没有radius属性. 那么, 你能用new Ball(10).radius来访问radius的值吗? 也不能吧?? 那岂不是Ball也没有Radius属性了???

上面的分析, 足以说明, private属性是被继承了的.
jinguizi 2005-07-06
  • 打赏
  • 举报
回复
同意,简单说就是子类可访问到父类private属性的成员,但这不是继承了父类私有属性成员
midthinker 2005-07-06
  • 打赏
  • 举报
回复
呵呵,楼上众朋友讨论的好激烈,

就在下的观点,这个问题似乎被各位解释的牵强了,如果要问实现的底层机制是不是子类直接映射到整个父类,但只是在访问时加了层访问控制(这似乎就是楼上的许多朋友对JAVA继承的观点),我不是JAMES,所以无法回答。
不过,如果是问继承功能在JAVA中的表现形式,我到是可以蛮有把握的说,private field/method 即无法被子类继承,亦不能被子类访问。
至于哪位高人就底层(说到底层实现了,那还真不知道是不是非要套上个面向对象了)的实现机制有相当的了解,到是应该站出来发一帖,即让大家长长见识,又可平息了争论。
呵呵
@.@||~
ericsion 2005-07-06
  • 打赏
  • 举报
回复
dyh506(浪) 的答案很正确,子类里有一个完整的父类。但是由于父类private因此子类无法继承。不有以为通过父类非私有方法(具体是public protected default看情况而定)可以访问到private属性就说可以继承。重要的是在你的子类里是否可以直接引用该属性。

想象一下,你遇到了一个不是你写的类通过文档你发现其中有几个private属性,而你无法直接访问只能通过对你公开的方法访问,那么你认为你继承那个类了吗?
qybao 2005-07-06
  • 打赏
  • 举报
回复
你继承了你父亲的一部分DNA,但你就是不能去掉这部分来自你父亲的遗传DNA(也就是不能直接访问,夸张一点说,没有任何方法可访问该属性,除非你DNA突变,变异了,换句话说,系统异常或崩溃了),这是否说明你不继承你父亲的遗传DNA?继承和访问是两个概念,同样,继承和封装也是两个概念,你继承了你父亲的DNA,并不代表破坏了你父亲对DNA的封装,因为你始终就是不能直接访问?

-------- --------
|驱动程序| |操作系统|
|--------| --〉|--------
| 硬 件 | |驱动程序|
-------- |--------|
产品1 | 硬 件 |
--------
产品2

产品1的硬件为私有private,产品1的驱动程序层可以直接访问硬件层,产品2继承产品1,产品2的操作系统层不能直接访问硬件层,但是可以通过调用驱动程序层的接口访问硬件层(也就是通过调用父类的public方法访问private属性),是否认为产品2不继承产品1的硬件?产品1对硬件(private属性)进行了封装,使得产品2子类也不能直接访问,但是产品2还是离不开硬件这个private属性,否则产品2将无法正常运作。

我印象中这个问题很多书都有相关的讨论,大家去看看就明白了,不要把概念混淆了。



Jokehan 2005-07-06
  • 打赏
  • 举报
回复
无可争论,父类的private成员是可以被子类继承下来的,而只是受到了private的影响从而限制了访问权限!
Dan1980 2005-07-06
  • 打赏
  • 举报
回复
从对象逻辑上考虑, 似乎private是父类私有的, 不能遗传给子类, 这种说法也有其道理.

但是很多持这种观点的人, 特别是初学者, 只是从表面上来认识这个问题, 未免有失严谨.

正如<Thinking in JAVA>中提到了"问题空间(Problem Space)"和"解决空间(Solution Space)", 面向对象思想的流行让我们把注意力更多地转移到了"问题空间", 但"解决空间"同样也是不能忽视的. OO并不是完美无缺, 试图用OO来解释一切也是不可行的.
laughsmile 2005-07-06
  • 打赏
  • 举报
回复
我同意子类对象的存储空间包含了父类的private属性的存储空间,创建子对象的时候,在这个对象里面自动包含了一个父类对象.
但是,这就说明父类的private变量被子类继承了么?
我觉得那样就完全颠覆了OO的封装性.OO的封装性就是通过private实现对自己私有数据成员的隐藏而实现.
其实,这只是一个概念问题,具体的逻辑都已经清楚了
dyh506 2005-07-06
  • 打赏
  • 举报
回复
|-------|
| 父类 | 这是在内存中的状态子类拥有一个完整的父类.
|-------|
|子类 |
|_______|
ukey235 2005-07-06
  • 打赏
  • 举报
回复
写段代码测试一下不就知道!
Jokehan 2005-07-06
  • 打赏
  • 举报
回复
还有人说不能,心寒,我楼下的[yinwenjie(java入门中)]和[dugumu()]这两位朋友请先搞懂后在发言,请不要不负责任的发言- -!
Dan1980 2005-07-06
  • 打赏
  • 举报
回复
同jokehan(): 无语中.....!
加载更多回复(36)

62,614

社区成员

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

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