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);
}
}
超类是让子类只使用公有和保护方法/场。
这使得超类的设计者可以改变这些方法的实现,只要他认为它更好,而不会破坏子类的正确性。
一本教科书示例是一个complex number类。
使用这个类只需要功能的程序员,他不关心,如果实施与imaginary
和real
领域或与radius
和theta
领域[两种不同的方式来表示复数。
它允许ComplexNumber
类的设计者更自由,如果他想在后来的版本中更改类,并且它还允许用户更少的担心:他不需要关心所有的细节,有的正在照顾他。
奖金:注意你可以打破这种行为,并通过使用reflection访问私有字段和方法 - 但是当你这样做的 - 所有的赌注都关闭了,你做你自己的责任。
是的,我明白你的意思了。超类数据成员只是为了安全和封装而声明为private。除此之外,公有和私有之间没有其他区别。 – Teja 2012-02-05 17:42:22
没有一个例子,你的问题不是很清楚,但我怀疑“私有数据成员操作的方法”不是私有。不要紧,他们通过访问私人数据工作 - 他们自己不是私人的。如果公共方法只能访问其他公共成员等,访问修饰符是毫无意义的。
封装的要点是只有类本身应该关心实现细节,例如有问题的字段,但可以公开合同就其公共(和受保护的)API而言。课外代码不应该关心私人实施细节。
JLS说:
被声明为private类的成员不是由类的 子类继承。只有被声明为 保护或公开的类的成员才会被声明在 包中声明的子类继承,而不是声明该类的声明。
所以,要回答你的问题。不,私人成员不能被子类访问。
私人会员不会遗传;只有受保护的和公众的成员。
如果可能的话,你可以做下列操作之一:
- 让超类的私有财产保护的
- 张扬干将(如果需要的setter方法)为私营性质
我试图在导致错误的注释部分中打印超类私有成员。 – Teja 2012-02-05 17:43:43