5

我的理解是静态成员属于该类。那么为什么Java允许我用一个对象来访问它们呢?

要理解我的意思,请参阅以下示例:

public class Student {
  public static int number = 0;
}

number是一个属于 class 的静态字段Student,但我仍然可以访问它,如下所示:

Student s = new Student();
int n = s.number;

这个决定背后的理由是什么?

4

3 回答 3

7

这背后的基本原理是对象是类的一个实例,因此除了实例级属性之外,它还应该能够访问属于该类的每个属性。

这就像传统的邮件。如果您收到一封寄给您全家人(静态成员)的邮件,您会觉得被授权打开它,因为您是该家庭的成员。另一方面,如果邮件是寄给您(实例成员)的,则只有您有权打开它,您的家人无权打开它。

这也适用于其他面向对象的语言,如 C++。但是,不鼓励使用该s.number符号来访问静态成员,因为它会误导代码的读者。您应该始终使用该Student.number符号,因为这清楚地表明它number是一个静态成员。如果您通过实例变量访问静态成员,现代语言(例如 C#)会发出警告,但根据语言规范,它仍然是完全合法的。

于 2012-06-16T09:57:48.487 回答
4

经过一些明显的阅读后,java编译器做了必要的不祥之物来处理访问静态变量的对象实例,它知道你想要你的意思.. IDEs会给你一个警告..

关于原因和解释,请阅读:为什么通过实例调用静态方法不是Java编译器的错误?

最终它是一个语言规范,你只需要处理它.. 是否使用它是你的决定.. 我的建议:不要!

于 2012-06-16T09:54:41.403 回答
0

这背后的基本原理是...... JLS - 第 8.3.1.1 章。静态字段

于 2012-06-16T09:54:22.653 回答