为什么不禁止访问私有字段?

时间:2010-01-24 12:20:01

标签: java

对于我在大学里的学习,我不得不做一些丑陋的java基础知识,比如没有封装的工作,同一类的主要方法等等。(我不想在java风格指南上开一个讨论,我只是想要澄清一下,我不会在大学之外写这样的东西)

我偶然发现了一种我无法向自己解释的行为:

public class Person {
  // fields
  private int age;

  public static void main(String[] args) {
    Person foo1 = new Person();
    foo1.age = 40;
    System.out.println(foo1.age);
  }
}

为什么这段代码编译运行没有错误?我怎么可能访问私人领域?由于主要方法在同一个类中而导致奇怪的行为?

6 个答案:

答案 0 :(得分:17)

因为静态方法main是类Person的成员,因此可以访问Person中的任何私有字段或方法。

你在担心什么?有人会编写一个类,然后能够从他们自己的类中访问这些方法吗?

如果您要担心任何事情,请担心您可以使用反射访问任何类中的私有字段,但即使这对于许多有用的事情都是必要的。

答案 1 :(得分:15)

是的 - 在Java中,private是类私有而非私有实例。

许多其他语言使用私有实例,例如Ruby和Smalltalk。

答案 2 :(得分:2)

由于您的main方法位于同一个类中,并且实例变量具有私有访问权限,因此它仅适用于同一类的方法。没有访问修饰符可以限制同一个类的方法访问其成员变量。这就是这里发生的事情。如果你的主要方法在某个其他类中虽然在同一个包中,但它不会编译。

答案 3 :(得分:1)

您可以从班级内部访问私人字段。这就是每班定义它们的重点。

答案 4 :(得分:0)

您可以在Person类中编写任何其他静态方法,并从该方法访问私有变量。 Main 只是一个名字。这就是生活。

答案 5 :(得分:0)

因为您的方法main(String[] args)是在类Person中定义的。如果方法是在Person类之外定义的,那么你将无法做到这一点。