子类中的静态方法,与超类中的签名具有相同的签名

时间:2014-08-11 15:00:03

标签: java inheritance static static-methods

"您可以在子类中编写一个新的静态方法,该方法与超类中的签名具有相同的签名,从而隐藏它。"这是我从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。如果我的实现对于给定的概念是错误的......请给出任何证明该陈述的例子。

3 个答案:

答案 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并不允许你这样做。