【问题标题】:private variable constraints java私有变量约束java
【发布时间】:2013-09-23 09:39:42
【问题描述】:

只是为了举例,我将 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
    }
}

据我所知,对 obj1 的私有变量 test 的访问仅存在于 ClassA 的方法中,并且应该从 obj1 的上下文中调用这些方法。

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

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

【问题讨论】:

  • 如果它们是你私有的(类),你可以访问它们。
  • Private Member Access Java 的可能重复项
  • “那么我们可以从 ClassA 方法中访问任何 ClassA 类型对象的私有变量吗?”是的。

标签: java


【解决方案1】:

当你自己写的时候:

那么我们可以访问任何 ClassA 类型对象的私有变量吗 来自 ClassA 方法。

这是正确的。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      以下

      据我所知,可以访问 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?
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

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

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-02-21
            • 2012-05-09
            • 2012-07-26
            • 2013-06-22
            • 2021-09-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多