private 属性到底能不能被子类继承? 这个问题可能看起来很简单,但我找了许多书,给出的答案都很模糊,在这里要听听高人的看法。子类可以继承通过父类的public 方法 访问private属性,这是否也意味着private属性能被继承。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不能,但private属性可以通过继承父类的public 方法来得到。 class C{ pivate int a; private string b;... public int getA(){ return a; } public String getB(){ return b; }} 这个问题已经讨论过很多次了. 楼主可以找找以前的相关贴子.在我看来, 子类继承父类的一切东西. <Thinking in JAVA>中说到, 子类对象拥有父类对象的完整拷贝. 实例化一个类是从最顶级的超类开始实例化的, 是一层一层的包裹结构. private限制访问方式只能在类的内部, 这仅仅是一个访问控制, 实际上子类对象拥有父类对象的一切. private主要还是在多线程环境下使用.它不能被继承,而通过public方法来访问它,并不能说它可以被子类继承! private属性当然不能继承,这还用怀疑么?至于你说的用public方法来得到属性值,那只能说明子类可以访问父类的公共方法。并不能说明private属性可以继承. 不能,严格理解private 只能在本类内部访问 肯定部能,如果可以,那还叫什么private! 同意 Dan1980(也该有一些作为了) class 父亲 { private double 父亲的money; public double 付给儿子抚养费(){ return 父亲的money/1000; }}class 儿子 extends 父亲{ public double 找父亲要钱(){ return 付给儿子抚养费(); }}//父亲的money并没有被儿子继承,但是儿子可以找父亲要钱。//另外实例化儿子的时候,父亲也同时被实例化了.但这同样不表示父亲的money被儿子继承 个人觉得Dan1980说的确实有道理,子类继承父类的一切.private只是访问控制. 这个问题比较复杂,我个人也一直很模糊。从所有的文档来看,几乎都指明private是不能被子类继承的。但是由于JAAS的存在,可以突破private的控制来访问其中的private对象,在这种情况下,发现private是已经被子类继承了的。BTW:这种研究是没有意义的,继承都建议大家少用。 我觉得无论能不能访问,一个subclass应该继承superclass的一切东西。比如说人会有脑子,这是其他人不能直接访问的,可以看做私有属性,但是可以和他来交谈来获取脑子中的信息。男人应该是人的子类,它至少应该是一个完整的人,人所具有的,他也必须具有,那么他肯定也要有脑子了,即使不能被直接访问。个人观点,呵呵。 子类继承父类的一切,private只是访问控制。一个子类对象包含一个完整的父类子对象,这点从内存分配上就可以知道。一个子类在创建的时候,也创建了一个完整的父类子对象,即先分配父类对象的存储空间,再扩展自身的存储空间,这样子类才能通过调用父类的public方法,在相应的内存地址找到对应的private属性。既然子类对象的存储空间包含了父类的private属性的存储空间,就说明子类还是继承了父类的private属性,只是不能直接访问这块内存地址而已。 显然public -->给所有人上private --->给包里的人上protect --->给儿子上 to yangbc(土豆块):继承滥用是不太好,但我觉得抽象类还是有存在的必要的。如果抽象类能存在的话,我那个例子还是成立的。人是一个抽象的概念,但是我觉得它可以抽象成一个抽象类,因为毕竟有很多属性是其子类共有的。偶还是觉得私有属性也会被继承。 private的内存的确是被开辟了。 就是应为java继承是单继承,所以这也是不用java继承的一个因素,毕竟一个没有渊源的纯洁的类太少了,大多数都有这样那样的前科,可java只有一个继承机会,所以这个机会要留给最关键或者说最无奈的关系,而一些只是约束类的行为的部分就大可抽象为接口,留待实现类自己去发挥了,说到这,我个人又觉得继承的好处了,至少一些普遍的方法可以不必自己手动实现了 居然有那么多人说private成员不能被子类继承,无语- -! 不能,但可以通过get、set方式访问 不能。任意一个类A都可以通过另一个类B的public 函数访问B的private数据。 同jokehan(): 无语中.....! 还有人说不能,心寒,我楼下的[yinwenjie(java入门中)]和[dugumu()]这两位朋友请先搞懂后在发言,请不要不负责任的发言- -! 我同意子类对象的存储空间包含了父类的private属性的存储空间,创建子对象的时候,在这个对象里面自动包含了一个父类对象.但是,这就说明父类的private变量被子类继承了么?我觉得那样就完全颠覆了OO的封装性.OO的封装性就是通过private实现对自己私有数据成员的隐藏而实现.其实,这只是一个概念问题,具体的逻辑都已经清楚了 从对象逻辑上考虑, 似乎private是父类私有的, 不能遗传给子类, 这种说法也有其道理.但是很多持这种观点的人, 特别是初学者, 只是从表面上来认识这个问题, 未免有失严谨.正如<Thinking in JAVA>中提到了"问题空间(Problem Space)"和"解决空间(Solution Space)", 面向对象思想的流行让我们把注意力更多地转移到了"问题空间", 但"解决空间"同样也是不能忽视的. OO并不是完美无缺, 试图用OO来解释一切也是不可行的. 无可争论,父类的private成员是可以被子类继承下来的,而只是受到了private的影响从而限制了访问权限! dyh506(浪) 的答案很正确,子类里有一个完整的父类。但是由于父类private因此子类无法继承。不有以为通过父类非私有方法(具体是public protected default看情况而定)可以访问到private属性就说可以继承。重要的是在你的子类里是否可以直接引用该属性。想象一下,你遇到了一个不是你写的类通过文档你发现其中有几个private属性,而你无法直接访问只能通过对你公开的方法访问,那么你认为你继承那个类了吗? 同意,简单说就是子类可访问到父类private属性的成员,但这不是继承了父类私有属性成员 这个问题没必要再讨论了, 楼主可以结贴了. 我举个例子: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属性是被继承了的. 呵呵,楼上两位先去把TIJ第六章的继承这节熟读搞懂吧:) 楼楼上的Dan1980(也该有一些作为了)兄基本说对:) 子类调用父类的构造函数是为了初始化被子类继承下来的“所有数据成员(难道private成员就不是了??)”,而不是去为了创建一个父类对象而调用的,如果按照有些朋友所说的“dyh506(浪) 的答案很正确,子类里有一个完整的父类。”,那如果我所继承的父类是一个抽象类,试问怎么产生此父类的实例??:) 你继承了你父亲的一部分DNA,但你就是不能去掉这部分来自你父亲的遗传DNA(也就是不能直接访问,夸张一点说,没有任何方法可访问该属性,除非你DNA突变,变异了,换句话说,系统异常或崩溃了),这是否说明你不继承你父亲的遗传DNA?继承和访问是两个概念,同样,继承和封装也是两个概念,你继承了你父亲的DNA,并不代表破坏了你父亲对DNA的封装,因为你始终就是不能直接访问? -------- --------|驱动程序| |操作系统||--------| --〉|--------| 硬 件 | |驱动程序| -------- |--------| 产品1 | 硬 件 | -------- 产品2产品1的硬件为私有private,产品1的驱动程序层可以直接访问硬件层,产品2继承产品1,产品2的操作系统层不能直接访问硬件层,但是可以通过调用驱动程序层的接口访问硬件层(也就是通过调用父类的public方法访问private属性),是否认为产品2不继承产品1的硬件?产品1对硬件(private属性)进行了封装,使得产品2子类也不能直接访问,但是产品2还是离不开硬件这个private属性,否则产品2将无法正常运作。我印象中这个问题很多书都有相关的讨论,大家去看看就明白了,不要把概念混淆了。 呵呵,楼上众朋友讨论的好激烈, 就在下的观点,这个问题似乎被各位解释的牵强了,如果要问实现的底层机制是不是子类直接映射到整个父类,但只是在访问时加了层访问控制(这似乎就是楼上的许多朋友对JAVA继承的观点),我不是JAMES,所以无法回答。 不过,如果是问继承功能在JAVA中的表现形式,我到是可以蛮有把握的说,private field/method 即无法被子类继承,亦不能被子类访问。 至于哪位高人就底层(说到底层实现了,那还真不知道是不是非要套上个面向对象了)的实现机制有相当的了解,到是应该站出来发一帖,即让大家长长见识,又可平息了争论。呵呵@.@||~ 什么叫继承?我想听听大家说!面向对象思想与 语言的实现,有直接关系吗?在实现上,子类拥有父类的一切。但从面向对象说,这不并是说子类继承了父类。而仅仅是java的一种实现这就好比java是单根Object,可是面向对象的理论中是由多重继承的。这又怎么解释?同意 回复人: qybao(阿宝) ( ) 信誉:100 问题是我们需要如此在乎内在的实现吗? 对于我们来说使用JAVA编程就好象是使用一种约定俗成的规范构造程序一样,我们更在乎的应该是应用域的问题,其次是解决域的问题,至于语言底层的实现机制是如何的似乎并不那么重要。 重要的是,我们知道面向对象中关于继承的机制与规范,至于C++是如何实现的,JAVA是如何实现的,交给语言学家就可以了(或者感兴趣的人们也可以尝试成为该领域的专家)。另外如果我们依然要讨论面向对象是什么?继承又是什么?依我看还是交给哲学家去争论吧HOHO~~~@.@||~ 在我看来, 子类继承父类的一切东西. <Thinking in JAVA>中说到, 子类对象拥有父类对象的完整拷贝. 实例化一个类是从最顶级的超类开始实例化的, 是一层一层的包裹结构. private限制访问方式只能在类的内部, 这仅仅是一个访问控制, 实际上子类对象拥有父类对象的一切.个人同意这样的观点 望有学习过JAVA的人回答? final修饰的问题,求精通Java的老师解释一下 String取值 关于反射 新手提问,简单的一个java练习题,不知怎么修改最合理。 学习C++的一点体会(转贴) 遇到点小问题:请各位帮忙解决哈!或者是给点意见!!!谢谢!!给高分听取意见!! 可以帮我看看哪里出错么 谢啦 , 弄了半天没找出错误 jTabbedPane上面的页标签怎么去掉啊??急救 我想买think in java,但听说第二版(中文)要出了,不知什么时候能出? 如何用Java得到图片文件的尺寸? 关于ArrayList的小问题 急!!!!!!!!!!!!!!!!!!!!!
pivate int a;
private string b;
... public int getA(){
return a;
} public String getB(){
return b;
}
}
它不能被继承,而通过public方法来访问它,并不能说它可以被子类继承!
private double 父亲的money;
public double 付给儿子抚养费(){
return 父亲的money/1000;
}
}class 儿子 extends 父亲{
public double 找父亲要钱(){
return 付给儿子抚养费();
}
}
//父亲的money并没有被儿子继承,但是儿子可以找父亲要钱。
//另外实例化儿子的时候,父亲也同时被实例化了.但这同样不表示父亲的money被儿子继承
这种研究是没有意义的,继承都建议大家少用。
一个子类对象包含一个完整的父类子对象,这点从内存分配上就可以知道。
一个子类在创建的时候,也创建了一个完整的父类子对象,即先分配父类对象的存储空间,再扩展自身的存储空间,这样子类才能通过调用父类的public方法,在相应的内存地址找到对应的private属性。既然子类对象的存储空间包含了父类的private属性的存储空间,就说明子类还是继承了父类的private属性,只是不能直接访问这块内存地址而已。
public -->给所有人上
private --->给包里的人上
protect --->给儿子上
但是,这就说明父类的private变量被子类继承了么?
我觉得那样就完全颠覆了OO的封装性.OO的封装性就是通过private实现对自己私有数据成员的隐藏而实现.
其实,这只是一个概念问题,具体的逻辑都已经清楚了
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属性是被继承了的.
|驱动程序| |操作系统|
|--------| --〉|--------
| 硬 件 | |驱动程序|
-------- |--------|
产品1 | 硬 件 |
--------
产品2产品1的硬件为私有private,产品1的驱动程序层可以直接访问硬件层,产品2继承产品1,产品2的操作系统层不能直接访问硬件层,但是可以通过调用驱动程序层的接口访问硬件层(也就是通过调用父类的public方法访问private属性),是否认为产品2不继承产品1的硬件?产品1对硬件(private属性)进行了封装,使得产品2子类也不能直接访问,但是产品2还是离不开硬件这个private属性,否则产品2将无法正常运作。我印象中这个问题很多书都有相关的讨论,大家去看看就明白了,不要把概念混淆了。
不过,如果是问继承功能在JAVA中的表现形式,我到是可以蛮有把握的说,private field/method 即无法被子类继承,亦不能被子类访问。
至于哪位高人就底层(说到底层实现了,那还真不知道是不是非要套上个面向对象了)的实现机制有相当的了解,到是应该站出来发一帖,即让大家长长见识,又可平息了争论。
呵呵
@.@||~
我想听听大家说!面向对象思想与 语言的实现,有直接关系吗?在实现上,子类拥有父类的一切。但从面向对象说,这不并是说子类继承了父类。而仅仅是java的一种实现这就好比java是单根Object,可是面向对象的理论中是由多重继承的。这又怎么解释?
同意 回复人: qybao(阿宝) ( ) 信誉:100
对于我们来说使用JAVA编程就好象是使用一种约定俗成的规范构造程序一样,我们更在乎的应该是应用域的问题,其次是解决域的问题,至于语言底层的实现机制是如何的似乎并不那么重要。
重要的是,我们知道面向对象中关于继承的机制与规范,至于C++是如何实现的,JAVA是如何实现的,交给语言学家就可以了(或者感兴趣的人们也可以尝试成为该领域的专家)。另外如果我们依然要讨论面向对象是什么?继承又是什么?依我看还是交给哲学家去争论吧
HOHO~~~
@.@||~