考虑使用这段代码:
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
你有什么想法吗?
答案 0 :(得分:1)
此代码
System.out.println(base.a + " " + base.getA());
打印
Sub1 2
因为getA()
(及其System.out.println(“Sup”))在创建String并且println
完成执行之前被调用。
步骤就像这样
System.out.println(base.a + " " + base.getA());
被称为base.getA()
,执行System.out.print("Sub");
并返回2
。此时,Sub
将打印到out
。base.a
的串联,其值为1
,返回 2 ,即值2
1 2
Sub
,然后 4 的结果会附加到Sub1 2
。答案 1 :(得分:0)
为什么
System.out.println(base.a + " " + base.getA());
和System.out.println(base.getA());System.out.println(base.a);
会提供不同的输出?
在第一种情况下,您首先打印base.a
,然后打印base.getA()
秒。在第二种情况下,您首先打印base.getA()
,然后打印base.a
秒。显然,这些数字将是另一种方式。