Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何访问这个私有变量?_Java_Private - Fatal编程技术网

Java 如何访问这个私有变量?

Java 如何访问这个私有变量?,java,private,Java,Private,当我编写以下代码时,编译器如何不抱怨 public class MyClass { private int count; public MyClass(int x){ this.count=x; } public void testPrivate(MyClass o){ System.out.println(o.count); } } 即使它是编写了testPrivate的同一类的实例,它不应该在System.

当我编写以下代码时,编译器如何不抱怨

public class MyClass 
{
    private int count;

    public MyClass(int x){
        this.count=x;
    }

    public void testPrivate(MyClass o){
        System.out.println(o.count);
    }   
}
即使它是编写了
testPrivate
的同一类的实例,它不应该在
System.out.println(o.count)
处给出编译错误吗?毕竟,我正试图直接访问私有变量。

代码甚至可以正常运行。

私有成员可以从声明它的类中的任何方法访问,而不管该方法是访问它自己(
)实例的私有成员还是其他实例的私有成员

这一点载于:

…否则,如果该成员或构造函数被声明为私有,则只有当且仅当访问发生在包含该成员或构造函数声明的顶级类(§7.6)的主体内时,才允许访问


Java的这个特性允许您编写接受类实例作为参数的方法(例如-
clone(Object-other)
compareTo(Object-other)
)对于所有需要访问的私有属性,不依赖具有非私有getter的类。

私有字段是整个类的私有字段,而不仅仅是对象的私有字段


其他类不知道MyClass有一个名为count的字段;但是,MyClass对象知道另一个MyClass对象具有count字段。

声明为私有的方法、变量和构造函数只能在声明的类本身内访问。检查

虽然它是testPrivate所在的同一类的实例 写的,但不应该通过编译器错误在 系统输出打印项次(o.计数)

。它永远不会抛出编译错误

这与简单的getter和setter或copy构造函数的工作非常相似。请记住,我们可以使用
this访问
private
成员。

public MyClass {
  private String propertyOne;
  private String propertyTwo;

  // cannot access otherObject private members directly
  // so we use getters
  // But MyClass private members are accessible using this.
  public MyClass(OtherClass otherObject) {
      this.propertyOne = otherObject.getPropertyOne();
      this.propertyTwo = otherObject.calculatePropertyTwo();
  }

  public void setPropertyOne(String propertyOne) {
      this.propertyOne = propertyOne;
  }

  public String getPropertyOne() {
      return this.propertyOne;
  }
}
您的
testPrivate
方法接受MyClass的实例。由于
testPrivate
MyClass
中的一个方法,因此它可以访问
private
属性

  public void testPrivate(MyClass o) {
      this.propertyOne = o.propertOne;
  }
在类中定义的方法始终可以通过
this.
和实例变量访问其
private
成员


但是如果您在
MyClass
之外定义
testPrivate
,那么您将无法访问
private
成员。在那里,您必须使用方法、setter或getter。

访问器不是安全的!它们是封装,以使其他人不必知道代码

考虑一下,如果有人写了一个错误,但在他消除了最后一个错误后就消失了——理解代码会导致一个人要么从宇宙中删除,要么发疯

尽管有这个小缺点,但如果封装得当,这应该成为您首选的排序算法,因为除Sort之外的所有字段和方法都应该是私有的


你不知道它是如何工作的,你也不想知道它是如何工作的,但它是如何工作的,这就足够了。另一方面,如果所有内容都是公共的,您必须了解它是如何正确使用它的——这太麻烦了,我将坚持使用quicksort。

Class MyClass知道count变量,因此没有问题它是类的私有,而不是实例的私有。Java不会试图阻止你的左手撞击你的右手通过Eclipse或IDEA hashCode和equals方法生成,它们看起来总是way@PeterLawrey是的,但我的印象是,如果我试图访问私人文件,编译器会打我的头;但这是班级的隐私,这是有道理的。感谢you@KanwaljeetSingh令人惊讶的是,如果你在一个嵌套类中有一个私有字段/方法/构造函数,你仍然可以在同一个外部类的另一个嵌套类中访问它。TBH,我并没有意识到这一点,但在我桌上的Java tome中,它确实被明确列为私有的警告(Hansen Krüger的第200页上的清单9.6:“Java编程手册”,Addison Wesley,2012)。在Venners的“Java虚拟机内部”一书中第一眼就没有提到,tho.谢谢你的问题和答案。谢谢你,现在这很有意义。我一直使用带有getter的
compareTo
equals
。当我注意到我们也可以不使用getter访问它时,这很奇怪。添加得不错,我需要的就是解释