我有以下代码:
class Baap {
public int h = 4;
public int getH() {
System.out.println("Baap " + h);
return h;
}
}
public class Beta extends Baap {
public int h = 44;
public int getH() {
System.out.println("Beta " + h);
return h;
}
public static void main(String[] args) {
Baap b = new Beta();
System.out.println("testing" + b.getH());
}
}
有人可以解释为什么这个代码打印: 输出:
Beta 44
testing44
为什么不首先打印testing
?
编辑: 我现在看到了,我有一个println,并在一个方法中调用另一个printn。谢谢ERAN
答案 0 :(得分:4)
在调用方法之前,始终完全评估方法参数。所以这一行:
System.out.println("testing" + b.getH());
评估为:
String lhs = "testing";
String rhs = b.getH();
String argument = lhs + rhs;
System.out.println(argument);
该扩展的第二行打印出“Beta 44”,因此您看到了结果。
正如我在评论中所指出的,你不需要任何继承来证明这一点 - 你甚至不需要一个实例,尽管这并不复杂。这是一个更简单的例子,显示了同样的事情:
public class Test {
public static String printAndReturn() {
System.out.println("In printAndReturn");
return "bar";
}
public static void main(String[] args) {
System.out.println("left " + printAndReturn());
}
}
输出:
In printAndReturn
left bar
(有关进一步的实验,尝试使用两种不同的方法,并使用method1() + method2()
...您会发现method1()
始终在method2()
之前执行。)
答案 1 :(得分:0)
评估第一个b.getH()
,因为要打印"testing" + b.getH()
,您必须知道b.getH()
是什么。
b.getH()
触发一些打印(Beta 44
),然后只有System.out.println("testing" + b.getH())
打印testing44
。