覆盖Java中的规则

时间:2011-09-10 18:53:27

标签: java override

以下是两个例子:

public class A {
    public void foo(A a) {
        System.out.println("in A");
    }
}


public class B extends A {      
    public void foo(B b) { // (1)
        System.out.println("in B");
    }
    public void f(Object o) { // (2)
        System.out.println("in B");
    }
}

我不明白为什么(1)和(2)被认为是A foo()的覆盖方法。方法编号1接受比原始foo()更低的类,我的意思是我不能向她发送任何A类,因为我看到它,(1)不延伸foo(),但它是仍然算作覆盖 - 为什么?((2)的相似论点,但相反)。

我让我认为它被压倒的原因是:

当我试图运行时

  B b = new B();

  b.foo(b);

它会检查A是否有foo接受B。因为每个B都是A,所以它确实有一个所以它应该打印“在A中”而不是“在B中”,因为B不会覆盖它。但它打印“在B”..

3 个答案:

答案 0 :(得分:5)

他们都没有覆盖超类A'a方法。

class A {
  public void foo(A a) {
    System.out.println("in A");
  }
}


class B extends A {

  @Override
  public void foo(B b) {
    System.out.println("in B");
  }
  @Override
  public void foo(Object o) {
    System.out.println("in B");
  }
}

当我编译上面的内容时,我得到错误:

$ javac -g O.java 
O.java:10: method does not override or implement a method from a supertype
  @Override
  ^
O.java:14: method does not override or implement a method from a supertype
  @Override
  ^
2 errors

但请注意,从重写方法返回子类是可以的。以下编译没有错误。

class A {
  public A foo() {
    System.out.println("in A");
    return this;
  }
}

class B extends A {
  @Override
  public B foo() {
    System.out.println("in B");
    return this;
  }
}

答案 1 :(得分:1)

要使覆盖生效,方法签名应该相同。在这种情况下,他们并不是因为他们所采取的论点不同。它们只是成员函数,1,2是重载。 (将2视为拼写错误。它应该是foo而不是f

答案 2 :(得分:0)

1)或2)都不会覆盖任何内容,因为您可以通过添加@Override注释来验证:

public class B extends A {

    @Override
    public void foo(B b) {
        System.out.println("in B");
    }

    @Override
    public void f(Object o) {
        System.out.println("in B");
    }
}

这两种方法都不会编译,因为它不会覆盖任何内容。