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

Myd*_*Myd 5 java oop

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

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

public class Student {
  public static int number = 0;
}
Run Code Online (Sandbox Code Playgroud)

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

Student s = new Student();
int n = s.number;
Run Code Online (Sandbox Code Playgroud)

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

buc*_*buc 7

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

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

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