![](/img/trans.png)
[英]Access a private variable of the super() class in Java - JChart2D
[英]How does the subclass object access the private variable of super class,as in java no except the class itself can access the private variable?
这是pac.java
文件
package P1;
public class pac {
int a;
public int b;
private int c;
protected int d;
public pac(){
a=1;
b=2;
c=3;
d=4;
}
public void test(){
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
}
这是不同包中的其他文件pack1.java
package P3;
class pac1 extends P1.pac{
public static void main(String args[]) {
pac1 ob=new pac1();
ob.test();
}
}
题:
从我所示的两个文件中,文件P3\\pac1.java
创建一个访问类P1\\pac.java
的私有变量的对象?
方法“ test()”位于类“ pac”内部。 因此,当您创建pac实例时,测试方法属于该实例,并且可以查看和使用所有变量。
如果执行此操作,则将导致错误。
int mainC = ob.c;
main方法(正在发生这种情况)无法访问变量“ c”
我从您未指定的代码中了解到的是,您实例化了一个公共类并调用了它的公共方法。 很好,test()方法可以访问变量。 您无法通过pac1中的其他方法直接访问它们。
语句pac1 ob=new pac1();
正在创建一个Pac1
类的new
对象,这是可能的,因为它是public
。
使用ob.test()
可以在对象本身上调用方法。 由于private int c
是定义了test()
的同一类的成员,因此它可以访问它。
Pac1
的对象,因为该类是public
。 为了澄清您的疑问,您不能在main
方法中像此类ob.c
一样访问类外部的私有成员。
考虑一个非常简单的例子。 对于javabean,我们将member设置为private
,将getter setter设置为public
。 我们只能使用公开的getter和setter来访问它们。
public class SomeClass{
private int someMember;
public int getSomeMember(){
return this.someMember;
}
}
现在从类外部,假设您的main方法中,
SomeClass someClass = new SomeClass();
someClass.someMember; // This is not possible as we are directly accessing private field
someClass.getSomeMember; // possible because `getSomeMember` is public and it belongs to `SomeClass` so can access private member `someMember`.
`
pac1.java仅不访问pac.java的私有成员c。 它仅调用pac的公共方法测试,该方法访问同一类的成员。
如果我理解正确,您会很好奇,尽管ob是派生类的对象,但是调用ob.test()如何访问私有成员。 原因是方法是否具有访问权限是在编译时而不是运行时确定的,并由该方法的位置确定。 您的测试方法在pac类中声明。 因此,编译器允许它访问pack类的所有私有成员。 现在,在执行该方法时,它会表明您的方法正在执行的对象类型是pac1。 那不重要。
面向对象语言的这一特性不是错误。 通过提供仅提供有限访问权限的方法,该类的编写者可以对私有成员提供有限访问权限。
在Java中, 子类对象无法访问任何超类的私有变量(或方法) 。
在您的示例中, pac1类仅访问pac类的公共功能,例如公共默认构造函数和公共方法test() 。 由于这些方法的实现是在超类中定义的,因此两者都可以访问其私有功能-例如private int c 。
但是,如果您在子类中重写这些方法,则重写方法实现将无法访问pac私有类功能。
HTH。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.