我的理解是静态成员属于该类。那么为什么Java允许我用一个对象来访问它们呢?
要理解我的意思,请参阅以下示例:
public class Student {
public static int number = 0;
}
这number
是一个属于 class 的静态字段Student
,但我仍然可以访问它,如下所示:
Student s = new Student();
int n = s.number;
这个决定背后的理由是什么?
这背后的基本原理是对象是类的一个实例,因此除了实例级属性之外,它还应该能够访问属于该类的每个属性。
这就像传统的邮件。如果您收到一封寄给您全家人(静态成员)的邮件,您会觉得被授权打开它,因为您是该家庭的成员。另一方面,如果邮件是寄给您(实例成员)的,则只有您有权打开它,您的家人无权打开它。
这也适用于其他面向对象的语言,如 C++。但是,不鼓励使用该s.number
符号来访问静态成员,因为它会误导代码的读者。您应该始终使用该Student.number
符号,因为这清楚地表明它number
是一个静态成员。如果您通过实例变量访问静态成员,现代语言(例如 C#)会发出警告,但根据语言规范,它仍然是完全合法的。
经过一些明显的阅读后,java编译器做了必要的不祥之物来处理访问静态变量的对象实例,它知道你想要你的意思.. IDEs会给你一个警告..
关于原因和解释,请阅读:为什么通过实例调用静态方法不是Java编译器的错误?
最终它是一个语言规范,你只需要处理它.. 是否使用它是你的决定.. 我的建议:不要!
这背后的基本原理是...... JLS - 第 8.3.1.1 章。静态字段