我们可以访问包含对私有数据成员的操作的超类方法并打印结果。但是为什么我不能使用在我的main函数中调用它们的SubClass对象来打印超类的私有数据成员?有人请解释一下。
以下是以下示例。
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 :(得分:2)
安全性和encapsulation
超类允许其子类仅使用公共和受保护的方法/字段。
这允许超类的设计者在不破坏子类正确性的情况下改变这些方法的实现,如果他更好地看到它们。
教科书示例是complex number课程。
使用这个类的程序员只需要它的功能,他不关心实现是imaginary
和real
字段还是 radius
和theta
字段[表示复数的两种不同方式]。
它允许ComplexNumber
类的设计者更自由,如果他想在更高版本中更改类,并且它还允许用户减少后顾之忧:他不需要关注所有细节,有些人正在照顾他。
奖励:请注意,您可以使用reflection来破解此行为并访问私有字段和方法 - 但是当您这样做时 - 所有投注都已关闭,您可以自行完成责任。
答案 1 :(得分:1)
如果没有示例,您的问题就不是很明确,但我怀疑“对私有数据成员进行操作的方法”不是私有的。他们通过访问私人数据工作并不重要 - 他们自己不是私人的。如果公共方法只能访问其他公共成员等,则访问修饰符将毫无意义。
封装的全部意义在于,只有类本身应该关注实现细节,例如相关字段,但是可以根据其公共(和受保护)API公开契约。类外的代码不应该关心私有实现细节。
答案 2 :(得分:0)
JLS说:
声明为private的类的成员不会继承 该类的子类。仅声明的类的成员 protected或public由包中声明的子类继承 除了宣布上课的那个。
所以,回答你的问题。不,子类无法访问私有成员。
答案 3 :(得分:0)
私人会员不是继承的;只有受保护和公共成员才有。
如果可能,您可以执行以下操作之一: