扩展抽象类的Java程序

时间:2015-09-24 22:00:00

标签: java abstract-class extend

我不清楚扩展课程的程序。鉴于以下代码,为什么输出为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;
}

1 个答案:

答案 0 :(得分:3)

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

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;
}

f()类对象的RtsC实现来自RtsB,因为这是覆盖f()的最低级别的类,因此使用其实现,并返回b3。该值乘以10,然后从a添加到RtsA,因为zorg只知道x的类型为RtsA所以使用该字段。那是3 * 10 + 2 = 32

(请注意,RtsA是抽象的这一事实根本没有出现;这大多只在你有抽象方法担心的时候才有意义。)