是否有任何注释警告子类不应该隐藏Java中的静态方法

时间:2017-07-25 13:49:59

标签: java inheritance annotations

我有一个包含Java中的公共静态方法的类。在java中是否有任何注释警告子类不要使用相同的方法签名(从而隐藏超类方法)。任何其他解决方法也没关系。

3 个答案:

答案 0 :(得分:2)

只需创建超类方法final

class Foo {
    public static final void go() {}
}

class Bar extends Foo {
    public static void go() {};  // Error
}

Ideone Example

答案 1 :(得分:0)

你不需要这样的注释,因为你试图做的不打算...

在java中你只能覆盖静态方法

正如@thomas建议的那样(+1 dafuer),你可以玩静态方法的可见性 例如:

public class Calculator {

    static int add(int a, int b) {
        System.out.println("a+b= " + (a + b));
        return a + b;
    }

    public static void main(String[] args) {

    }
}

然后

public class ScientificCalculator extends Calculator {

    public int add(int a, int b) {
        System.out.println("11111");
        return a + b;
    }

}

答案 2 :(得分:0)

我不知道任何这样的注释来标记方法的声明。但是,你可以从相反的方向接近这个。您可以查看它的用法,而不是关注方法声明。如果有任何使用可能是个问题,-Xlint:all会发出警告。与其超类中的静态方法具有相同签名的静态方法仅在从实例而非静态引用该方法时才会导致问题。考虑这个例子:

public class Foo {

  public static String getFoo(){
    return "foo";
  }
}

public class Bar extends Foo {

  public static void main(String[] args){

    Bar bar = new Bar();
    String s = bar.getFoo(); // Actually calls Foo.getFoo()
    System.out.println(s); // Prints "foo"

   }
}

在上面的代码中,我们引用getFoo()中的静态Foo方法到Bar的实例。 bar.getFoo()行实际上从Foo调用静态方法。现在假设我们为Bar添加一个具有相同签名的静态方法:

public class Bar extends Foo {
   public static String getFoo(){
      return "bar";
   }

  public static void main(String[] args){

    Bar bar = new Bar();
    String s = bar.getFoo(); // Actually calls Bar.getFoo()
    System.out.println(s); // Prints "bar"

   }
}

这会隐藏Foo.getFoo()的{​​{1}}方法,现在调用Bar方法。在真实的背景下,这几乎肯定会打破Bar.getFoo()。如果您使用Bar选项进行编译,那么您将收到以下消息:

-Xlint:all

编译warning: [static] static method should be qualified by type name, Foo, instead of by an expression的第一个版本时,您会注意到这一点,并且可以立即将其修复为Bar。稍后当String s = Foo.getFoo()也添加到getFoo时,原始代码仍然有效,因为它明确引用了Bar中的方法。如果总是通过引用声明它们的类来显式调用静态方法,那么在子类中使用相同方法的唯一问题是它不是最佳实践。也许有一种标记声明的方法,但我会专注于确保正确使用静态方法。