从子类调用重写的超类方法

use*_*183 2 java inheritance overriding

public class F {
    protected int a=0, b=0;
   public F() {
     a = 2;
     b = 2;
     }
  public void increase() {
     upA();
  } 
  public void upA() {
     a = a + 1;
  }
  public String toString() {
     return a+" "+b;
   }
 }
Run Code Online (Sandbox Code Playgroud)
 public class G extends F {
      public void increase() {
            super.increase();
            upB();
      }
     public void upA() {
            a = a + a;
     }
     public void upB() {
          b = b + 1;
   }
 }
Run Code Online (Sandbox Code Playgroud)

以下Java片段在"输出"窗口中打印了什么?

 G g = new G();
 g.increase();
 System.out.println(g);
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释为什么答案是 4,3

(即,虽然我调用了super.increase()来调用超类中的upA方法,但是调用了子类方法?)

Jon*_*eet 6

所有方法都被虚拟调用,覆盖应用.所以这段代码在F:

public void increase() {
    upA();
} 
Run Code Online (Sandbox Code Playgroud)

...正在调用G.upA(),因为它正在调用的对象upA()是一个实例G.

所以执行流程increase()是:

  • G.increase() 电话 super.increase()
    • F.increase() 电话 upA()
    • G.upA() 执行(所以a = 4)
  • G.increase() 电话 upB()
    • G.upB() 执行(所以b = 3)