0

考虑有一段代码:

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

你有什么想法?

4

2 回答 2

1

这段代码

System.out.println(base.a + " " + base.getA());

印刷

Sub1 2

因为getA()(及其 System.out.println("Sup")) 在创建字符串并println完成执行之前被调用。

步骤是这样的

  1. System.out.println(base.a + " " + base.getA());叫做
  2. base.getA()被调用、执行System.out.print("Sub");和返回2。此时,Sub打印到out
  3. 一个字符串被创建为 的连接base.a,它是值12的返回,它是值2
  4. 结果字符串3被打印出来,字符串1 2
  5. 输出已经包含Sub,然后4的结果被附加到那个,所以Sub1 2.
于 2013-08-05T19:29:46.200 回答
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第二个。所以很明显,数字将是相反的。

于 2013-08-05T19:15:49.557 回答