1

这是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

4

6 回答 6

0


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

于 2013-07-09T07:15:25.787 回答
0

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

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

 int mainC = ob.c; 

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

于 2013-07-09T07:00:29.280 回答
0

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

于 2013-07-09T07:00:34.143 回答
0

该语句pac1 ob=new pac1();正在创建一个类new对象,Pac1它是可能的,因为它是public

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

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

为了澄清您的疑问,您不能ob.cmain方法中像这样访问类外的私有成员。

考虑一个非常简单的例子。对于 javabean,我们将 member asprivate和 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`.

`

于 2013-07-09T07:01:45.793 回答
0

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

于 2013-07-09T07:02:38.550 回答
0

如果我理解正确,您会好奇调用 ob.test () 是如何访问私有成员的,尽管 ob 是派生类的对象。原因是方法是否具有访问权限是在编译时确定的,而不是在运行时确定的,而是由方法所在的位置确定的。您的测试方法在您的 pac 类中声明。所以编译器允许它访问包类的所有私有成员。现在,在执行方法时,您的方法正在执行的对象类型是 pac1。那不重要。

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

于 2013-07-09T07:03:49.937 回答