Java - 为什么允许将变量名称作为类型名称

时间:2013-07-20 16:21:26

标签: java class naming-conventions

假设我有班级ClassA

我可以声明一个变量,如下所示

public ClassA ClassA;

注意: - 变量名称与类型名称相同 没有编译错误。

当您想要调用静态方法

时,这可能会导致混淆
ClassA.someStaticMethod();

在上面语句中ClassA将被视为实例变量,如果它为null,则无法调用静态方法。

为什么它仍然允许?

是否存在可能有益的用例?

1 个答案:

答案 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标识符的唯一限制是它们不能是关键字。

  

是否存在可能有益的用例?

你可能会为自己解决这个问题:尽可能努力(不),我无视你找到一个;)