子类对象如何访问超类的私有变量,就像在java中一样,除了类本身可以访问私有变量之外,没有其他类可以访问私有变量?
这是子类对象如何访问超类的私有变量,就像在java中一样,除了类本身可以访问私有变量之外,没有其他类可以访问私有变量?,java,object,packages,Java,Object,Packages,这是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);
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
类的新对象,这是可能的,因为它是公共的
使用ob.test()。由于private int c
是定义了test()
的同一类的成员,因此它可以访问它
- 私有成员变量或方法可以在定义它的整个类中访问
- 您可以创建
Pac1
的对象,因为该类是public
为了澄清您的疑问,您不能像main
方法中的ob.c
那样访问类外的私有成员
考虑一个非常简单的例子。对于javabean,我们将成员设置为private
,将getter setter设置为public
。我们只能使用getter和setter访问它们,因为它们是公共的
public class SomeClass{
private int someMember;
public int getSomeMember(){
return this.someMember;
}
}
现在在课堂之外,假设在你的主要方法中
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的公共方法test,该方法访问同一类的成员。如果我理解正确,您会好奇调用ob.test()如何访问私有成员,尽管ob是派生类的对象。原因是方法是否具有访问权限是在编译时而不是运行时确定的,并且由方法的位置确定。您的测试方法在pac类中声明。因此编译器允许它访问pack类的所有私有成员。现在,当涉及到执行方法时,您的方法正在执行的对象类型是pac1。那没关系
面向对象语言的这一特性并非错误。通过提供只提供有限访问权限的方法,类的编写者可以对私有成员提供有限访问权限
在Java中,子类对象不能访问任何超类的私有变量(或方法)
在您的示例中,pac1类仅访问pac类的公共功能,例如公共默认构造函数和公共方法test()。由于这些方法的实现是在超类中定义的,因此两者都可以访问其私有功能,例如私有int c.
但是,如果在子类中重写这些方法,则重写方法实现将无法访问类pac私有功能。
HTH.事实并非如此,您的帖子或代码中也没有相反的证据。只有类“pac”显示对其私有成员的访问。OP对私有
的含义有误解。请阅读封装
。这是工作的预期。