首先,这不是一种覆盖形式。(重写发生在方法被继承,而static
方法在 Java 中不被继承。)
这被称为“隐藏”......但有点错觉。访问隐藏的静态方法或字段非常容易。因此,这种“技术”并不是特别有用。
如果有的话,隐藏是一个坏主意,因为它可能是程序错误的来源......或者至少是看起来像这样做但实际上正在做不同事情的代码源。
所以我的建议是避免隐藏而不是寻找使用它的地方。(事后看来,如果 Java 语言将其视为编译错误可能会更好......)
为了记录,这是一个隐藏的例子:
public class A {
public static String method() { return "'A.method()'"; }
}
public class B extends A {
public static String method() { return "'B.method()'"; }
public static void main(String[] args) {
System.out.println(A.method()); // prints 'A.method()'
System.out.println(B.method()); // prints 'B.method()'
System.out.println(method()); // prints 'B.method()'
}
}
在上面,method()
inB
的版本隐藏了 in 的版本A
,但无论如何你都可以调用它。“隐藏”是一种错觉。
这是一个示例,它显示了它可能导致的问题类型:
A a = new A();
B b = new B();
System.out.println(a.method()); // prints 'A.method()'
System.out.println(b.method()); // prints 'B.method()'
b = a;
System.out.println(b.method()); // prints 'B.method()'
看起来我们正在调用实例方法......直到你打第三个method()
电话。
还有另外两个术语——“遮蔽”和“遮蔽”——适用于不同的上下文: