Java 扩展摘要的过程 class

Java procedures of extending abstract class

我不太清楚扩展a的过程class。给定以下一段代码,为什么输出是 32?

class Rts {
    public static void main(String[] args) {
        System.out.println(zorg(new RtsC()));
    }

    static int zorg(RtsA x) {
        return x.f()*10 + x.a;
    }
}

abstract class RtsA {
    int a = 2;
    int f() { return a; }
}

class RtsB extends RtsA {
    int a = 3;
    int f() { return a; }
}

class RtsC extends RtsB {
    int a = 4;
}

首先,字段不会被覆盖,所以这一切等同于

public class Rts {
    public static void main(String[] args) {
        System.out.println(zorg(new RtsC()));
    }
    static int zorg(RtsA x) {
        return x.f()*10 + x.a;
    } 
}

abstract class RtsA {
  int a = 2;
  int f() { return a; }
}
class RtsB extends RtsA {
  int b = 3;
  int f() { return b; }
}
class RtsC extends RtsB {
  int c = 4;
}

RtsC 类型对象的 f() 实现来自 RtsB,因为这是覆盖 f() 的最低级别 class ,所以使用了它的实现,即returnsb,也就是3。它乘以 10,然后从 RtsA 添加到 a,因为 zorg 只知道 x 是类型 RtsA,所以该字段被使用。那是 3 * 10 + 2 = 32.

(请注意,RtsA 是抽象的这一事实根本没有涉及;这主要只在您需要担心抽象方法时才重要。)