为什么Java允许使用对象实例访问静态成员

时间:2012-06-16 09:32:23

标签: java oop

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:7)

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

就像传统邮件一样。如果您收到发给您全家的邮件(静态会员),您将有权打开它,因为您是该家庭的成员。另一方面,如果邮件是发给您的(实例成员),则只有您有权打开它,而不是您家中的任何其他人。

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

答案 1 :(得分:4)

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

关于原因和解释,请阅读:Why isn't calling a static method by way of an instance an error for the Java compiler?

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

答案 2 :(得分:0)

这背后的理由是...... JLS - Chapter 8.3.1.1. static Fields