尝试在此代码中了解b.h和b.getH()的打印顺序

时间:2015-01-13 22:20:20

标签: java

我想知道为什么打印以下代码:

Beta 44
44 44

请纠正我,因为我的分析显然不正确,但我无法弄清楚原因。

首先调用

b.h,然后调用44,然后调用b.getH()并打印" Beta 44"。因此控制台会打印44 Beta 44。为什么不是这样?

public class Beta {

    public int h = 44;
    public int getH(){
        System.out.println("Beta "+h);
        return h;
    }
    public static void main(String[] args) {
        Beta b = new Beta();
        System.out.println(b.h+" "+ b.getH());
    }

}

5 个答案:

答案 0 :(得分:2)

System.out.println(b.h+" "+ b.getH());

is equivalent to (YMMV)

StringBuilder builder = new StringBuilder();
String result = builder.append(b.h).append(" ").append(b.getH()).toString();
System.out.println(result);

如您所见,虽然首先评估b.h,但在从连接构造整个String值之前不会打印它。该构造涉及调用具有其自己的

b.get()
System.out.println("Beta "+h);

答案 1 :(得分:2)

要在System.out.println(b.h+" "+ b.getH());中投放main行,必须先调用b.getH,然后再System.out.println

输出的第一行来自对b.getH的调用(特别是来自<{1}} 内部的方法)。第二行来自对System.out.println的封闭式调用。

答案 2 :(得分:2)

Java必须在运算符执行操作之前评估所有必需的参数。

在这种情况下,在b.getH()连接到b.h + " "的结果之前调用b.getH()

下面,

  1. b.h" "连接,以获得"44 "
  2. b.getH()被召唤。
  3. getH()打印"Beta 44"
  4. getH()返回44
  5. 44从步骤(1)连接到"44 "的末尾,产生"44 44",现在已打印出来。

答案 3 :(得分:2)

  首先调用

b.h

b.h是一个字段,而不是一个方法,因此它不能被称为#34;。你的代码从中读取的值,得到44,并暂时保存它; 还没有打印出来。

  

然后调用b.getH()并打印&#34; Beta 44&#34;

那是对的 - 这是你获得第一行的方式,即"Beta 44"

  

因此控制台会打印44 Beta 44

这不是控制台应该打印的内容,因为"Beta 44"内的getH()必须在 b.h+" "+ b.getH()开始打印之前完成打印

在获取这两个部分之前,控制台无法开始打印b.h+" "+ b.getH()。一旦b.getH()返回,println已准备好所有部分,即从阅读b.h获得的44,在其间放置的空间,最后是44在末尾打印。因此,"44 44"会在第二行打印出来。

答案 4 :(得分:1)

首先b.h+" "+ b.getH()必须先进行评估才能打印出来。根据您的预期输出,您可以完成类似

的操作
public static void main(String[] args) {
    Beta b = new Beta();
    System.out.print(b.h);
    System.out.print(" ");
    System.out.println(b.getH());
}

您现有的版本相当于

String temp = b.h+" "+ b.getH();
System.out.println(temp);