子类对象如何访问超类的私有变量,如java中没有,除了类本身可以访问私有变量?

时间:2013-07-09 06:53:39

标签: 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);
        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的私有变量的对象?

6 个答案:

答案 0 :(得分:0)

方法“test()”在“pac”类中。因此,当您创建pac实例时,测试方法属于此实例,并且可以查看和使用所有变量。

如果你这样做了,那就会导致错误。

 int mainC = ob.c; 

主要方法(发生这种情况)无法访问变量“c”

答案 1 :(得分:0)

我从未分配的代码中理解的是,您实例化一个公共类并调用它的公共方法。这很好,test()方法可以访问变量。您无法直接从pac1中的其他方法访问它们。

答案 2 :(得分:0)

语句pac1 ob=new pac1();正在创建new类的Pac1对象,因为它是public,所以可能会这样做。

使用ob.test()您正在调用对象本身的方法。由于private int c是定义test()的同一个类的成员,因此可以访问它。

  • 私有成员变量或方法可以在定义它的整个类中访问。
  • 您可以创建Pac1的对象,因为该课程为public

为了澄清您的疑问,您无法使用ob.c方法中的main访问班级外的私人会员。

考虑一个非常简单的例子。对于javabean,我们将成员设为private,将getter设置为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`.

`

答案 3 :(得分:0)

pac1.java只是没有访问pac.java的私有成员c。它只调用pac的公共方法测试,并且该方法访问同一类的成员。

答案 4 :(得分:0)

如果我理解正确,你很好奇调用ob.test()访问私有成员,尽管ob是派生类的对象。原因是方法是否具有访问权限是在编译时确定的,而不是在运行时确定的,并且由方法的位置确定。您的测试方法在pac类中声明。因此编译器允许它访问pack类的所有私有成员。现在,当涉及到执行该方法时,会发现您的方法正在执行的对象类型是pac1。那没关系。

面向对象语言的这个特性不是一个错误。它使类的编写者可以通过提供仅提供有限访问的方法来提供对私有成员的有限访问。

答案 5 :(得分:0)


在Java中,子类对象不能访问任何超类的私有变量(或方法) 在您的示例中, pac1 类仅访问类 pac 的公共功能,例如公共默认构造函数&公共方法 test()。由于这些方法的实现是在超类中定义的,因此两者都可以访问其私有的功能 - 例如 private int c 。 但是,如果在子类中覆盖这些方法,则重写方法实现将无法访问类 pac 私有功能。
HTH。