子类对象如何访问超类的私有变量,就像在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对
私有
的含义有误解。请阅读
封装
。这是工作的预期。