繁体   English   中英

子类对象如何访问父类的私有变量,就像java中一样,除了类本身可以访问私有变量之外,否?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM