public class Test extends A
{
public static void main(String[] args)
{
System.out.println(new Test().a);
System.out.println(new Test().b);
}
}class A
{
private int a;
}
报错如下:
The field A.a is not visible
b cannot be resolved or is not a field
这是不是可以说明,private 的a被继承了呢?

解决方案 »

  1.   

    怎么可能 private 是私有
      

  2.   

    特意写给和你一样观点的人看的。
    private是访问控制符。
    我觉得帖里的例子已经充分证明了,private是可以继承,但不能直接访问的。
      

  3.   


    LZ 你的代码编译都不能通过吧  System.out.println(new Test().b); 这句怎么回事啊?
    就算排除那句 System.out.println(new Test().a);也是不能通过啊 
      

  4.   


    用private修饰过的数据成员或成员方法只能被该类自身访问和修改,而不能被任何其它类(包括该类的子类)访问和引用。
    当其它类(包括该类的子类)希望获取或修改private成员时,需要借助该类的方法类实现。
    就这么简单

    这个问题不应该纠结这么久的。
      

  5.   


    报错如下:
    The field A.a is not visible
    b cannot be resolved or is not a field

    主题里说明了会报错,我没想过要让他编译通过。
    我是希望你们看看两个错误的区别
      

  6.   

    报错如下:
    The field A.a is not visible
    b cannot be resolved or is not a field
    如果不能被继承,是不是相当于没有这个东西?那么是不是应该报错为【b】,可是报错为【a】,这就说明有a这个东西,只是不可见,not visible
      

  7.   

    确实,从这个角度来说,继承与否没有任何关系,反正都是要getter和setter的。
    但是,楼主只是为了说明一些错误的观点,他想用个例子证明给大家看,private是可以被继承的。
      

  8.   

    学了java的人都应该知道private用要getter和setter吧。
      

  9.   

    从实际应用的角度看,这个问题实在没必要纠结。
    但是,既然有人提出了这个问题,【这个问题很多年前就有了,直到现在还有人认为private不能被继承】。我就觉得有必要去讨论了。
    至少从【访问控制符】的【访问】两个字,就可以看出问题,private是控制【访问】,不是控制【继承】
      

  10.   

    用private修饰的变量如果要被其他类调用,就要生成它的get ,set方法,否则无法访问。如果随便都可以访问,那封装还有什么用呢
      

  11.   

    这帖讨论是的private属性的继承问题,不是访问问题。
      

  12.   

    private的变量是不能被继承的,它只能通过该类的非private的方法去访问,
    报错如下:
    /////////
    The field A.a is not visible
    b cannot be resolved or is not a field
    这是不是可以说明,private 的a被继承了呢?
    ////////////////

    第一句报错是说字段a是不可见的,就是说在继承体系中子类看不见父类的private变量,也即是说子类不知道父类是否有这个变量,因为它看不见啊,这样它还如何继承呢?你这里让他访问了一个对他隐藏的变量,它当然就报错不可见了;
    第二句的错误就是简单的语法错误,并不能对你的理论做什么证明,在类A中根本就没有变量b,
    这两句报错信息并不能证明private的a 被继承,
      

  13.   

    debug看一下不久知道了new一个子类对象,看一下有没有父类的属性不久ok了
      

  14.   

    为什么我要加一个没有定义的b变量?
    如果按照你的说法,子类不知道父类是否有这个变量,因为它看不见啊。
    那么a和b应该是没有区别的。
    因为它不知道父类有没有a。
    可是现在他已经提示了,a不可见,说明它知道有a这个变量。
      

  15.   

    private定义的属性没有经过封装的话那个属性就只能在他定义的那个类用用如上问中的
    class A
    {
        private int a;
    }
    a 就只能在Class A中用, 没有经过封装,它的子类是不能调用的
      

  16.   

     = = 。继承不是复制。。不是把父类的东西copy到自己这里,当你要使用一些属性或者方法的时候,首先会先自己这里找找看看有没有,如果没有则会去父类中找,也就是说 当你访问a这个属性的时候他发现自己并没有这个属性于是到父类中找,结果找到了,去访问时发现 是private不能被别人访问,所以报了不可见,而相反b 在自己这里没找到在父类中也没找到。。所以报不是一个有效的属性。。你自己在A类中写个方法。。你看用Text类调用这个方法的时候是跑到A类中了还是在Test中。。当然这只是我的想法
      

  17.   

     ----------- Java Language Specification(Edition 3) §6.6.8
      

  18.   

    这个必须顶。这才是有事实有真相。虽然我暂时还不认同,但是java他爹都说了不继承,我也没什么好说的了。我没底气跟权威拽
      

  19.   

    嗯,一开始我也跟楼主站在一边的,认为子类继承了父类的所有成员,只不过他不具有某些成员的访问权限而已。但是后来仔细想了想,
    The field A.a is not visible
    说的是子类访问不到父类的a成员。
    我们换个思维想想,把private改成包访问权限。这时new Test().a就可以访问到。
    而且他访问的是子类从父类那继承过来的属性a。而不是父类的属性a。也就是说,new Test().xxx访问的是子类的成员。假如,子类能继承父类的私有属性或其他,
    那么子类访问自己的private属性应该是没问题的吧?
    但是实际上他访问不了那个从“父类继承来的private属性”,也就是说
    子类压根就没有继承父类的private属性他为什么没有继承父类的private属性呢?正如21楼所说,父类的private属性对其子类是
    不可见的。他见都见不到,自然也继承不了了。至于为什么eclipse提示The field A.a is not visible
    我想那是因为子类因为可见性的问题(visible)没有从父类那继承到a属性
    所以它说父类的a属性不可见,子类继承不了,也访问不了
      

  20.   

    楼主 类中private成员都隐式的指定为是final的