【问题标题】:Java inheritance and subclassesJava继承和子类
【发布时间】:2011-10-09 19:25:42
【问题描述】:
Java 菜鸟在这里问一个简单的问题。
这是我将使用的类的基本布局。
public class Foo{
public static void Method1(){
Method 2();
}
public static void Method2(){
}
}
这是一个子类。
public class Foo2{
public static void Method2(){
}
}
我怎样才能这样写,以便调用Foo2.Method1() 使用Foo2.Method2() 而不是Foo1.Method2()?
【问题讨论】:
标签:
java
inheritance
subclass
【解决方案1】:
唯一的方法是在Foo2 中也创建一个Method1,它将调用Foo2.Method2。 Foo.Method2 是静态的总是会被 Foo.Method1 调用,不管进一步的子类化。静态方法没有覆盖。
【解决方案2】:
静态方法不是多态的,所以没有动态调度。因此解决方案是
- 使
Method2 非静态以激活动态调度或
-
覆盖将Method1隐藏在Foo2中或
- 如果这会导致大量代码重复,请创建一个辅助方法来
覆盖仅隐藏部分代码。
关于静态方法的详细信息:这些是类级别的方法,因此
- 您不能覆盖它们 - 如果您也在
Foo2 中定义它们,您将在 Foo 中隐藏实现。
- 您不应像在
Method1 中那样在实例上调用它们。如果您以传统方式调用它们,Foo.Method2,那么问题和可能的解决方案是什么就变得很明显了。
【解决方案3】:
继承和方法重载/覆盖仅适用于类的非静态部分。因此,没有办法做你想做的事。这也是为什么static应该尽量少用的原因——不能扩展。