如何处理静态方法覆盖?

时间:2011-04-15 04:26:18

标签: java oop

例如,

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) {
        ...
    }

}

5 个答案:

答案 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方法,那么它首先不应该是静态的。