覆盖Java中的规则

Num*_*tor 4 java overriding

这是两个例子:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么(1)和(2)被认为是A的覆盖方法foo().方法编号1接受比原版更低的类foo(),我的意思是我不能向她发送任何A类.正如我所看到的,(1)没有扩展foo(),但它仍然算作覆盖 - 为什么?(类似(2)的论据,但相反).

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

当我想跑的时候

  B b = new B();

  b.foo(b);
Run Code Online (Sandbox Code Playgroud)

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

Mis*_*ble 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");
  }
}
Run Code Online (Sandbox Code Playgroud)

当我编译上面的时候我得到错误:

$ 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
Run Code Online (Sandbox Code Playgroud)

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

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;
  }
}
Run Code Online (Sandbox Code Playgroud)