这个问题可能看起来很简单,但我找了许多书,给出的答案都很模糊,在这里要听听高人的看法。
子类可以继承通过父类的public 方法 访问private属性,这是否也意味着private属性能被继承。

解决方案 »

  1.   

    不能,但private属性可以通过继承父类的public 方法来得到。
      

  2.   

    class C{
       pivate int a;
       private string b;
    ...   public int getA(){
          return a;
       }   public String getB(){
          return b;
       }
    }
      

  3.   

    这个问题已经讨论过很多次了. 楼主可以找找以前的相关贴子.在我看来, 子类继承父类的一切东西. <Thinking in JAVA>中说到, 子类对象拥有父类对象的完整拷贝. 实例化一个类是从最顶级的超类开始实例化的, 是一层一层的包裹结构. private限制访问方式只能在类的内部, 这仅仅是一个访问控制, 实际上子类对象拥有父类对象的一切.
      

  4.   

    private主要还是在多线程环境下使用.
    它不能被继承,而通过public方法来访问它,并不能说它可以被子类继承!
      

  5.   

    private属性当然不能继承,这还用怀疑么?至于你说的用public方法来得到属性值,那只能说明子类可以访问父类的公共方法。并不能说明private属性可以继承.
      

  6.   

    不能,严格理解private 只能在本类内部访问
      

  7.   

    肯定部能,如果可以,那还叫什么private!
      

  8.   

    同意 Dan1980(也该有一些作为了)
      

  9.   

    class 父亲 {
      private double 父亲的money;
      public double 付给儿子抚养费(){
         return 父亲的money/1000;
      }
    }class 儿子 extends 父亲{
      public double 找父亲要钱(){
        return 付给儿子抚养费();
      }
    }
    //父亲的money并没有被儿子继承,但是儿子可以找父亲要钱。
    //另外实例化儿子的时候,父亲也同时被实例化了.但这同样不表示父亲的money被儿子继承
      

  10.   

    个人觉得Dan1980说的确实有道理,子类继承父类的一切.private只是访问控制.
      

  11.   

    这个问题比较复杂,我个人也一直很模糊。从所有的文档来看,几乎都指明private是不能被子类继承的。但是由于JAAS的存在,可以突破private的控制来访问其中的private对象,在这种情况下,发现private是已经被子类继承了的。BTW:
    这种研究是没有意义的,继承都建议大家少用。
      

  12.   

    我觉得无论能不能访问,一个subclass应该继承superclass的一切东西。比如说人会有脑子,这是其他人不能直接访问的,可以看做私有属性,但是可以和他来交谈来获取脑子中的信息。男人应该是人的子类,它至少应该是一个完整的人,人所具有的,他也必须具有,那么他肯定也要有脑子了,即使不能被直接访问。个人观点,呵呵。
      

  13.   

    子类继承父类的一切,private只是访问控制。
    一个子类对象包含一个完整的父类子对象,这点从内存分配上就可以知道。
    一个子类在创建的时候,也创建了一个完整的父类子对象,即先分配父类对象的存储空间,再扩展自身的存储空间,这样子类才能通过调用父类的public方法,在相应的内存地址找到对应的private属性。既然子类对象的存储空间包含了父类的private属性的存储空间,就说明子类还是继承了父类的private属性,只是不能直接访问这块内存地址而已。
      

  14.   

    显然
    public -->给所有人上
    private --->给包里的人上
    protect --->给儿子上
      

  15.   

    to yangbc(土豆块):继承滥用是不太好,但我觉得抽象类还是有存在的必要的。如果抽象类能存在的话,我那个例子还是成立的。人是一个抽象的概念,但是我觉得它可以抽象成一个抽象类,因为毕竟有很多属性是其子类共有的。偶还是觉得私有属性也会被继承。
      

  16.   

    private的内存的确是被开辟了。
      

  17.   

    就是应为java继承是单继承,所以这也是不用java继承的一个因素,毕竟一个没有渊源的纯洁的类太少了,大多数都有这样那样的前科,可java只有一个继承机会,所以这个机会要留给最关键或者说最无奈的关系,而一些只是约束类的行为的部分就大可抽象为接口,留待实现类自己去发挥了,说到这,我个人又觉得继承的好处了,至少一些普遍的方法可以不必自己手动实现了
      

  18.   

    居然有那么多人说private成员不能被子类继承,无语- -!
      

  19.   

    不能,但可以通过get、set方式访问
      

  20.   

    不能。任意一个类A都可以通过另一个类B的public 函数访问B的private数据。
      

  21.   

    同jokehan():  无语中.....!
      

  22.   

    还有人说不能,心寒,我楼下的[yinwenjie(java入门中)]和[dugumu()]这两位朋友请先搞懂后在发言,请不要不负责任的发言- -!
      

  23.   

    我同意子类对象的存储空间包含了父类的private属性的存储空间,创建子对象的时候,在这个对象里面自动包含了一个父类对象.
    但是,这就说明父类的private变量被子类继承了么?
    我觉得那样就完全颠覆了OO的封装性.OO的封装性就是通过private实现对自己私有数据成员的隐藏而实现.
    其实,这只是一个概念问题,具体的逻辑都已经清楚了
      

  24.   

    从对象逻辑上考虑, 似乎private是父类私有的, 不能遗传给子类, 这种说法也有其道理.但是很多持这种观点的人, 特别是初学者, 只是从表面上来认识这个问题, 未免有失严谨.正如<Thinking in JAVA>中提到了"问题空间(Problem Space)"和"解决空间(Solution Space)", 面向对象思想的流行让我们把注意力更多地转移到了"问题空间", 但"解决空间"同样也是不能忽视的. OO并不是完美无缺, 试图用OO来解释一切也是不可行的.
      

  25.   

    无可争论,父类的private成员是可以被子类继承下来的,而只是受到了private的影响从而限制了访问权限!
      

  26.   

    dyh506(浪) 的答案很正确,子类里有一个完整的父类。但是由于父类private因此子类无法继承。不有以为通过父类非私有方法(具体是public protected default看情况而定)可以访问到private属性就说可以继承。重要的是在你的子类里是否可以直接引用该属性。想象一下,你遇到了一个不是你写的类通过文档你发现其中有几个private属性,而你无法直接访问只能通过对你公开的方法访问,那么你认为你继承那个类了吗?
      

  27.   

    同意,简单说就是子类可访问到父类private属性的成员,但这不是继承了父类私有属性成员
      

  28.   

    这个问题没必要再讨论了, 楼主可以结贴了. 我举个例子: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属性是被继承了的.
      

  29.   

    呵呵,楼上两位先去把TIJ第六章的继承这节熟读搞懂吧:)
      

  30.   

    楼楼上的Dan1980(也该有一些作为了)兄基本说对:)
      

  31.   

    子类调用父类的构造函数是为了初始化被子类继承下来的“所有数据成员(难道private成员就不是了??)”,而不是去为了创建一个父类对象而调用的,如果按照有些朋友所说的“dyh506(浪) 的答案很正确,子类里有一个完整的父类。”,那如果我所继承的父类是一个抽象类,试问怎么产生此父类的实例??:)
      

  32.   

    你继承了你父亲的一部分DNA,但你就是不能去掉这部分来自你父亲的遗传DNA(也就是不能直接访问,夸张一点说,没有任何方法可访问该属性,除非你DNA突变,变异了,换句话说,系统异常或崩溃了),这是否说明你不继承你父亲的遗传DNA?继承和访问是两个概念,同样,继承和封装也是两个概念,你继承了你父亲的DNA,并不代表破坏了你父亲对DNA的封装,因为你始终就是不能直接访问? --------        --------
    |驱动程序|      |操作系统|
    |--------|  --〉|--------
    | 硬  件 |      |驱动程序|
     --------       |--------|
      产品1         | 硬  件 |
                     --------
                       产品2产品1的硬件为私有private,产品1的驱动程序层可以直接访问硬件层,产品2继承产品1,产品2的操作系统层不能直接访问硬件层,但是可以通过调用驱动程序层的接口访问硬件层(也就是通过调用父类的public方法访问private属性),是否认为产品2不继承产品1的硬件?产品1对硬件(private属性)进行了封装,使得产品2子类也不能直接访问,但是产品2还是离不开硬件这个private属性,否则产品2将无法正常运作。我印象中这个问题很多书都有相关的讨论,大家去看看就明白了,不要把概念混淆了。
      

  33.   

    呵呵,楼上众朋友讨论的好激烈,    就在下的观点,这个问题似乎被各位解释的牵强了,如果要问实现的底层机制是不是子类直接映射到整个父类,但只是在访问时加了层访问控制(这似乎就是楼上的许多朋友对JAVA继承的观点),我不是JAMES,所以无法回答。
        不过,如果是问继承功能在JAVA中的表现形式,我到是可以蛮有把握的说,private field/method 即无法被子类继承,亦不能被子类访问。
        至于哪位高人就底层(说到底层实现了,那还真不知道是不是非要套上个面向对象了)的实现机制有相当的了解,到是应该站出来发一帖,即让大家长长见识,又可平息了争论。
    呵呵
    @.@||~
      

  34.   

    什么叫继承?
    我想听听大家说!面向对象思想与 语言的实现,有直接关系吗?在实现上,子类拥有父类的一切。但从面向对象说,这不并是说子类继承了父类。而仅仅是java的一种实现这就好比java是单根Object,可是面向对象的理论中是由多重继承的。这又怎么解释?
    同意 回复人: qybao(阿宝) ( ) 信誉:100
      

  35.   

    问题是我们需要如此在乎内在的实现吗?
        对于我们来说使用JAVA编程就好象是使用一种约定俗成的规范构造程序一样,我们更在乎的应该是应用域的问题,其次是解决域的问题,至于语言底层的实现机制是如何的似乎并不那么重要。
        重要的是,我们知道面向对象中关于继承的机制与规范,至于C++是如何实现的,JAVA是如何实现的,交给语言学家就可以了(或者感兴趣的人们也可以尝试成为该领域的专家)。另外如果我们依然要讨论面向对象是什么?继承又是什么?依我看还是交给哲学家去争论吧
    HOHO~~~
    @.@||~
      

  36.   

    在我看来, 子类继承父类的一切东西. <Thinking in JAVA>中说到, 子类对象拥有父类对象的完整拷贝. 实例化一个类是从最顶级的超类开始实例化的, 是一层一层的包裹结构. private限制访问方式只能在类的内部, 这仅仅是一个访问控制, 实际上子类对象拥有父类对象的一切.个人同意这样的观点