社区
Java SE
帖子详情
private 属性到底能不能被子类继承?
zgh_remond
2005-07-04 09:50:07
这个问题可能看起来很简单,但我找了许多书,给出的答案都很模糊,在这里要听听高人的看法。
子类可以继承通过父类的public 方法 访问private属性,这是否也意味着private属性能被继承。
...全文
7881
56
打赏
收藏
private 属性到底能不能被子类继承?
这个问题可能看起来很简单,但我找了许多书,给出的答案都很模糊,在这里要听听高人的看法。 子类可以继承通过父类的public 方法 访问private属性,这是否也意味着private属性能被继承。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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)
php类中
private
属性
继承
问题分析
首先 这个题目就有点问题 因为
private
属性
是
不能
被
继承
的
龙天下整理c#中
继承
的例子
c#中
继承
是单
继承
,
子类
:父类的定议方式。 除了
private
修饰的字段、
属性
、方法
不能
被
子类
继承
,其他的都可以被
子类
继承
,下载中的例子用了一个爷爷、爸爸、儿子的关系,用简单的讲解讲述了C#中
继承
的用法。
关于
private
修饰的
属性
能否被
子类
继承
实际上
子类
对象拥有父类对象的一切,包括
private
。 父类的私有
属性
也可以被
子类
继承
,只是不可直接访问而已
protect
继承
_
private
属性
到底
可不可以被
继承
?
答案是不可以。不妨做个假设,若
不能
被
继承
,那么
子类
只能调用setter或者getter方法来访问父类的
private
属性
,同时父类也可以访问自己的
private
属性
,因此若
子类
通过super.set方法来设置父类的
private
属性
时,
子类
通过get方法得到的也应该是父类那个
private
私有
属性
,即如果在没调用
子类
setter方法来设置
private
属性
信息,
子类
依然可以通过getter方法得到...
JAVA中私有
属性
private
能被
子类
继承
吗?
JAVA中私有
属性
private
能被
子类
继承
吗? 分享| 2012-05-11 21:40heyiyong | 浏览 7757 次 java 2012-05-11 21:47 提问者采纳 肯定
继承
类访问父类私
属性
或 类
继承
继承
父类所东西 除构造函数 提问者评价 你说的肯定是对的!我调试过。
Java SE
62,630
社区成员
307,264
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章