假设我有班级ClassA
我可以声明一个变量,如下所示
public ClassA ClassA;
注意: - 变量名称与类型名称相同 没有编译错误。
当您想要调用静态方法
时,这可能会导致混淆ClassA.someStaticMethod();
在上面语句中ClassA
将被视为实例变量,如果它为null,则无法调用静态方法。
为什么它仍然允许?
是否存在可能有益的用例?
答案 0 :(得分:4)
如果为null,则无法调用静态方法。
可能:
public final class Foo
{
public static void yuck()
{
System.out.println("Yuck!");
}
public static void main(final String... args)
{
final Foo foo = null;
foo.yuck(); // compiles, and does the job
}
}
即使它看似违反直觉,但事实是静态方法只需知道类;即使Foo
的实例为null
,如上例所示,JVM也知道它属于类Foo
; yuck()
是一个静态方法,它不会“取消引用”实例,因为它不需要;因此,没有NPE。
为什么允许?
因为这是合法的Java标识符(JLS, section 6.2)。对Java标识符的唯一限制是它们不能是关键字。
是否存在可能有益的用例?
你可能会为自己解决这个问题:尽可能努力(不),我无视你找到一个;)