Java中的私有访问说明符用法继承

问题描述:

我们可以访问由私有数据成员上的操作组成的超类方法并打印结果。但为什么我无法使用调用它们的SubClass对象打印超类的私有数据成员在我的主要功能?有人请解释我。Java中的私有访问说明符用法继承

下面是以下示例。

class SuperClass1 
{ 
    private int a; 
    private int b; 

    SuperClass1(int p,int q) 
    { 
     a=p; 
     b=q; 
    } 
    SuperClass1(SuperClass1 obj) 
    { 
     a=obj.a; 
     b=obj.b; 
    } 
    SuperClass1() 
    { 
     a=-1; 
     b=-1; 
    } 

    int Vol() 
    { 
     return a*b; 
    } 
} 

class SubClass1 extends SuperClass1 
{ 
    int c; 

    SubClass1(int p,int q,int r) 
    { 
     super(p,q); 
     c=r; 
    } 
    SubClass1(SubClass1 obj) 
    { 
     super(obj); 
     c=obj.c; 
    } 
    SubClass1() 
    { 
     super(); 
     c=-1; 
    } 
} 


public class Super 
{ 
    public static void main(String[] args) 
    { 
     SubClass1 obj1=new SubClass1(); 
     //System.out.println("The values of obj1 are:"+obj1.a+""+obj1.b+""+obj1.c); 
     int vol=obj1.Vol(); 
     System.out.println("The volume is :"+vol); 
    } 
} 
+0

我试图在导致错误的注释部分中打印超类私有成员。 – Teja 2012-02-05 17:43:43

安全和encapsulation

超类是让子类只使用公有和保护方法/场。

这使得超类的设计者可以改变这些方法的实现,只要他认为它更好,而不会破坏子类的正确性。

一本教科书示例是一个complex number类。
使用这个类只需要功能的程序员,他不关心,如果实施与imaginaryreal领域radiustheta领域[两种不同的方式来表示复数。

它允许ComplexNumber类的设计者更*,如果他想在后来的版本中更改类,并且它还允许用户更少的担心:他不需要关心所有的细节,有的正在照顾他。

奖金:注意你可以打破这种行为,并通过使用reflection访问私有字段和方法 - 但是当你这样做的 - 所有的赌注都关闭了,你做你自己的责任。

+0

是的,我明白你的意思了。超类数据成员只是为了安全和封装而声明为private。除此之外,公有和私有之间没有其他区别。 – Teja 2012-02-05 17:42:22

没有一个例子,你的问题不是很清楚,但我怀疑“私有数据成员操作的方法”不是私有。不要紧,他们通过访问私人数据工作 - 他们自己不是私人的。如果公共方法只能访问其他公共成员等,访问修饰符是毫无意义的。

封装的要点是只有类本身应该关心实现细节,例如有问题的字段,但可以公开合同就其公共(和受保护的)API而言。课外代码不应该关心私人实施细节。

JLS说:

被声明为private类的成员不是由类的 子类继承。只有被声明为 保护或公开的类的成员才会被声明在 包中声明的子类继承,而不是声明该类的声明。

所以,要回答你的问题。不,私人成员不能被子类访问。

私人会员不会遗传;只有受保护的和公众的成员。

如果可能的话,你可以做下列操作之一:

  1. 让超类的私有财产保护的
  2. 张扬干将(如果需要的setter方法)为私营性质