"您可以在子类中编写一个新的静态方法,该方法与超类中的签名具有相同的签名,从而隐藏它。"这是我从Oracles authorised site for java tutorial读到的一句话。
我尝试以这种方式实现上述概念:
父类:
public class E {
public void throw1()
{
System.out.println("E is throwing");
}
}
儿童班:
public class D extends E{
public static void throw1()
{
System.out.println("D is throwing");
}
}
但是我收到错误说"这个静态方法无法隐藏E"中的实例方法。
Q1。我是否正确实施了这个概念?
Q2。如果是..问题是什么(为什么他的错误发生)? 如果不......还有什么问题呢?
Q3。如果我的实现对于给定的概念是错误的......请给出任何证明该陈述的例子。
答案 0 :(得分:4)
超类中的方法不是静态的,因此您无法使用静态方法隐藏它。如果你使超类中的方法为static,那么将隐藏超类静态方法。
固定的例子是
public class E {
public static void foo() {
System.out.println("E");
}
public static void main(String[] args) {
D.foo();
}
}
class D extends E {
public static void foo() {
System.out.println("D");
}
}
打印D。
这并没有隐藏任何东西,因为我仍然需要引用该类来调用该方法。如果我创建另一个类C extends D
但不添加任何静态方法,那么C.foo()将调用D.foo,隐藏E.foo。在这种情况下,jvm找到方法foo并从C开始查找它,然后继续向上遍历层次结构,直到找到匹配为止。
答案 1 :(得分:2)
对于隐藏方法,您需要两者都是静态的,或者两者都是非静态的。您不能混合和匹配(如果该方法由子类继承)。如果E.throw1()
是私有的,那么您现有的代码就可以运行。或者,您可以使D.throw1()
非静态,并且您现有的代码可以正常工作。最后,您可以使E.throw1()
静态,您的代码可以正常工作。
public class E {
public static void throw1()
{
System.out.println("E is throwing");
}
}
或
public class E {
private void throw1()
{
System.out.println("E is throwing");
}
}
或
public class D extends E{
public void throw1()
{
System.out.println("D is throwing");
}
}
答案 2 :(得分:1)
因为您正在使用与父类中存在的名称和方法签名相同的静态方法。方法throw1()是子类隐式固有的。简单地说,您无法声明具有相同名称的静态方法。
如果在java中允许这样做,那么当你从子类创建一个对象并尝试调用方法时 如
D d = new D();
d.throw1();
jvm或编译器无法识别throw1()方法,即使它是类中隐含的固有方法。因为它被具有相同名称的静态方法隐藏。因此,简单的java并不允许你这样做。