使用引用变量调用静态方法

时间:2011-03-21 15:53:27

标签: java

 Duck d = new Duck();
 string[] s = {};
 d.main();

当我们尝试使用引用变量而不是类名调用静态方法时,编译器是否会生成错误?

4 个答案:

答案 0 :(得分:5)

JLS定义的合法Java通过引用调用静态方法。但它在许多编码标准中都令人不悦。因此,一些编译器和一些IDE支持为其发出警告。

答案 1 :(得分:1)

这取决于编译器设置。使用eclipse默认设置,它将生成警告,例如。

请尝试使用 编译器设置。

通常,它不会产生错误(由JLS定义)

答案 2 :(得分:1)

如果使用标准编译器,则不会。

但它应该。

你永远不应该以这种方式调用静态方法。这样做绝对没有任何价值,它不是更快或更易读,但它是一个滴答作响的定时炸弹。请考虑以下情况:

class A {
    static void bar() {
        System.out.println( "A" );
    }
}

class B extends A {
    static void bar() {
        System.out.println( "B" );
    }
}

然后在代码中的某处,执行此操作:

    A foo = new B();
    foo.bar();

现在,这里调用了哪个bar()方法?

答案 3 :(得分:0)

首先回答你的问题,答案是否定的。显然,你可以使用引用变量代替类名来调用类内部的静态方法,但仅仅因为它合法并不意味着它是好的。虽然它有效,它会产生误导性和可读性较差的代码。当您说 d.main() 时,编译器会自动将其解析回真正的类。