为什么我的程序在变量之前打印方法?

时间:2015-03-11 08:49:10

标签: java

当我运行此程序时:

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吗?

3 个答案:

答案 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”)。