考虑使用这段代码:
public class Base {
int a = 1;
public int getA() {
System.out.print("Super");
return a;
}
public static void main(String[] argv) {
Base base = new Sub();
System.out.println(base.a + " " + base.getA());
System.out.println(base.getA());
System.out.println(base.a);
}
}
class Sub extends Base {
int a = 2;
public int getA() {
System.out.print("Sub");
return a;
}
}
输出是:
Sub1 2
Sub2
1
有人能给我解释一下输出吗?为什么 System.out.println(base.a + ""+ base.getA());
和 System.out.println(base.getA());System.out.println (base.a);
给出不同的输出?
我认为 System.out.println(base.a + ""+ base.getA());
的输出应该是 Sub2 1
你有什么想法吗?
最佳答案
这段代码
System.out.println(base.a + " " + base.getA());
打印
Sub1 2
因为 getA()
(及其 System.out.println("Sup"))在创建字符串和 println
完成执行之前被调用。
步骤是这样的
System.out.println(base.a + ""+ base.getA());
被调用base.getA()
被调用,执行System.out.print("Sub");
并返回2
。此时,Sub
被打印到out
。- 一个字符串被创建为
base.a
的串联,它是值1
和 2 的返回值,它是值2
- 打印结果字符串3,即字符串
1 2
- 输出已包含
Sub
,然后将 4 的结果附加到其中,因此Sub1 2
。
关于Java继承。有趣的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18065767/