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

为什么Java允许使用对象实例访问静态成员,java,oop,Java,Oop,我的理解是静态成员属于类。那么为什么Java允许我用对象访问它们呢 要理解我的意思,请参见以下示例: public class Student { public static int number = 0; } 这里的number是属于classStudent的静态字段,但我仍然可以访问它,如下所示: Student s = new Student(); int n = s.number; 这一决定背后的理由是什么?这一决定背后的理由是 阅读了一些内容后,java编译器显然会进行必要的h

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

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

public class Student {
  public static int number = 0;
}
这里的
number
是属于class
Student
的静态字段,但我仍然可以访问它,如下所示:

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

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

这一决定背后的理由是

阅读了一些内容后,java编译器显然会进行必要的hoodoo操作,以处理访问静态变量的对象实例,并且它知道您想要的是什么意思。。IDEs将就此向您发出警告

关于原因和解释,请阅读以下内容:


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

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

就像传统的邮件一样。如果你收到一封写给你整个家庭(静态成员)的邮件,你会觉得被授权打开它,因为你是这个家庭的成员。另一方面,如果邮件的地址是您(实例成员),则只有您有权打开它,您的家人中没有其他人


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

Google Translate尽其所能:)@Soufianehasou,也许我的编辑可以帮助您。我在这里谈到了C#。请您指定您从哪里呼叫
int n=s.number@m0skit0,请务必检查。这个问题最初的措辞是一个可怕的混乱。我在JLS中看不到任何理由本身的可能重复:只是一个简单的事实,你可以在一个对象上访问它。+1作为参考。这是他们在设计语言时做出的选择。你是对的,这本身不是一个基本原理。最初的问题是他为什么能够这样做。所以我认为这个链接可能会有帮助。谢谢你的回答,你已经解决了我的dom难题。因为我使用C#,所以我有这个。