例如,
public class A {
public static int f() { return 1; }
}
public class B extends A {
public static long f() { return 100L; }
}
不幸的是B.f()
无法编译,因为B.f()
试图覆盖A.f()
,因此名称冲突,因为返回类型不兼容。
我已经习惯了覆盖静态方法的目的是什么?任何用例?我可以在B级隐藏A.f()
吗?
实际使用情况:
class EntityDTO {
public static List<EntityDTO> marshal(Collection<? extends Entity> entities) {
...
}
}
class BookDTO extends EntityDTO {
public static List<BookDTO> marshal(Collection<? extends Book> books) {
...
}
}
答案 0 :(得分:2)
严格地说,静态方法不能被覆盖。方法覆盖只是对象多态的一个特性,静态方法不属于任何对象,而是属于类本身。
澄清一下,你不应该使用任何方法static
。这至少可以解决您的问题。由于方法参数不同,因此不会将其视为重写,而是重载。
答案 1 :(得分:1)
静态方法无法覆盖。
注意:你的B.f()
应该返回int而不是long来传递编译。
答案 2 :(得分:1)
静态方法不被覆盖...但它被称为方法隐藏。使用相同方法名称和参数的好处就像任何其他方法一样,优先于
答案 3 :(得分:1)
我想不出一个用于覆盖静态函数(在Java中)可能有用的用例,但是如果你绝对必须实现它,那么这就是:
import java.lang.reflect.Method;
class A {
public static void callOut() {
System.out.println("A.callOut");
}
}
public class B extends A {
public static void callOut() {
System.out.println("B.callOut");
}
public static void main(String[] args) throws Exception
{
A a = new A();
A b = new B();
Method aM = a.getClass().getMethod("callOut");
Method bM = b.getClass().getMethod("callOut");
aM.invoke(null); // prints A.callOut
bM.invoke(null); // prints B.callOut
}
}
答案 4 :(得分:0)
也许你需要重新考虑你的设计,如果你需要覆盖marshal方法,那么它首先不应该是静态的。