当我运行此程序时:
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(b.h + " " + b.getH());
Beta bb = (Beta) b;
System.out.println(bb.h + " " + bb.getH());
}
}
我得到以下输出:
Beta 44
4 44
Beta 44
44 44
如果仔细查看第一个System.out.println(b.h + " " + b.getH());
,这个命令是否告诉Java在getH()方法的值之前打印出h的值?
打印输出的第一部分不应该是4
而不是Beta 44
吗?
答案 0 :(得分:6)
在调用println
之前,将评估其参数 - b.h + " " + b.getH()
- 。在评估过程中,由于调用Beta 44
而打印getH()
。只有在评估之后,println
才会传递评估结果(4 44
)并打印出来。
答案 1 :(得分:2)
打印输出的第一部分不应该是4而不是Beta 44吗?
否,因为先调用getH()
来调用
System.out.println("Beta " + h);
然后
return h;
然后允许其余的主叫线
System.out.println(b.h + " " + b.getH());
待评估。
答案 2 :(得分:0)
你在安慰中看不出来是对的。 Wath发生了吗?你有一个经典的副作用。 Java评估从左到右的所有Arguments。 当我来到b.getH()方法时,它调用该方法。 在Beta.getH()中,行是“System.out.println(”Beta“+ h);” 所以这发生了。之后,getH()返回44.现在计算String Concationation,然后调用println(“4 44”)。