1

只是为了举例,我将 String 作为成员变量。但本来就有复杂的结构。

public class ClassA {

    private final String test ;

    public ClassA(String str) {
        test = str;
    }

    @Override public int hashCode() {
        return test.hashCode();
    }

    @Override public boolean equals(Object obj) {
        return obj instanceof ClassA && test.equals(((ClassA)obj).test);
    }

}


public class ClassB {

    public static void main(String args[])
    {
        ClassA obj1 = new ClassA("abc");
        ClassA obj2 = new ClassA("def");
        obj1.equals(obj2);
        obj2.test;//not valid
    }
}

据我所知,只能在 ClassA 的方法中访问私有变量testobj1这些方法应该从obj1.

当我调用obj1.equals(obj2)obj2 的测试变量时,可以从 obj1 的上下文中访问。

那么我们可以从 ClassA 方法中访问任何 ClassA 类型对象的私有变量吗?

4

5 回答 5

0

当然是的。私有访问说明符不能阻止类访问自己的变量。它与任何访问说明符无关。否则您的 getter 和 setter 方法将如何工作。

这是封装的基础。您可以通过创建一个类的对象来访问一个类的变量。但默认情况下,同一个类可以访问其成员。

正如有人正确指出的那样,即使超类的私有成员对其子类也不可见或不可访问。但这是一个不同的概念。

您可以浏览以下不错的文章/博客

http://inheritingjava.blogspot.in/2011/01/chapter-4-access-modifiers.html

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

于 2013-09-18T15:07:39.883 回答
0

“私有”并不意味着对象私有,而是类私有。使用私有字段的主要原因之一是实现隐藏,但是从类本身隐藏类实现是没有用的。

请记住,在这种情况下,“ClassA”实际上意味着“仅限 ClassA”。您将无法从 ClassA 的子类访问私有成员。

于 2013-09-18T14:53:52.057 回答
0

当你自己写:

那么我们可以从 ClassA 方法中访问任何 ClassA 类型对象的私有变量吗?

这是对的。

于 2013-09-18T14:51:18.217 回答
0

私有实例变量对于定义它们的类是私有的。

这并不意味着它们是私有的,变量值存储在实例中。

于 2013-09-18T14:52:07.740 回答
0

以下

据我所知,对 obj1 的私有变量 test 的访问仅存在于 ClassA 的方法中,并且应该从obj1.

只是部分正确:该方法也可能是ClassA(不在任何实例的上下文中ClassA)中的静态方法,这意味着您调用 ClassA.staticMethod(obj1); 在那里你可以访问obj1.test.

下面有肯定的回答:

So can we access the private variables of any object of type ClassA from within ClassA methods?
于 2013-09-18T14:52:17.313 回答