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
是抽象的这一事实根本没有涉及;这主要只在您需要担心抽象方法时才重要。)
我不太清楚扩展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
是抽象的这一事实根本没有涉及;这主要只在您需要担心抽象方法时才重要。)