当返回作为参数传递给其他方法时,为什么首先调用方法?

时间:2013-11-21 04:08:23

标签: java

我创建了两个名为clz1(main)& amp; clz2。

clz1:

public class clz1 {

    public static void main(String[]args){
        clz2 clz2object=new clz2();
        clz2object.display();
    }

    ...

}

clz2:

import java.util.Scanner;

public class clz2 {

    input=new Scanner(System.in);

    public String print1(){
        System.out.print("What is your name:");
        String a=input.next();
        return a;
    }

    public String print2(){
        System.out.print("What is your girlfriend's name:");
        String b=input.next();
        return b;
    }

    public void display(){
        System.out.println("Your name is "+print1()+" & your girlfriend's name is "+print2());
    }

}

,输出如下:

What is your name:aaa
What is your girlfriend's name:www
Your name is aaa & your girlfriend's name is www

怎么可能这样呢?我没有打电话给print1()print2() ...首先应该打印“你的名字是”和print1() ....然后“你女朋友的名字是“和print2() ......不是吗?

3 个答案:

答案 0 :(得分:3)

你的输出很有意义。您 致电print1()print2()。你在这一行中打电话给他们:

System.out.println("Your name is "+print1()+" & your girlfriend's name is "+print2());

当该行执行时,效果为:首先调用print1(),然后调用print2(),然后使用它们的返回值(用户输入)构建更长的字符串,然后传递该字符串到System.out.println()打印整件事。

发生这种情况的原因是因为字符串参数必须在传递给System.out.println()之类的方法之前完全构建 - 这就是Java的工作方式。所以需要的一切发生这种情况是为了完全构建字符串字符串发送到System.out.println()之前发生。

如果此处的操作顺序让您感到困惑,有两种方法可以考虑它。一个是以上可以改写成这样:

String s = "Your name is " + print1() + " & your girlfriend's name is " + print2();
System.out.println(s);

可以将其细分为:

String s1 = print1();
String s2 = print2();
String s = "Your name is " + s1 + " & your girlfriend's name is " + s2;
System.out.println(s);

如果你看一下,订单很清楚。这基本上就是发生了什么,你只需通过在一个语句中指定所有内容来获取快捷方式。

考虑它的第二种方式更具概念性:为了使您能够构建最终输出字符串并将其传递给System.out.println(),您知道返回值为print1()print2(),否则无法构建字符串!因此,他们首先执行

如果您想获得技术,则在Java语言规范的几个地方描述了这种行为。来自Section 8.4.1

  

当调用方法或构造函数(第15.12节)时,该值的值   实际参数表达式初始化新创建的参数   变量,每个声明的类型,在执行主体之前   方法或构造函数。

换句话说,Java将在System.out.println()完成其工作之前完全构建您的字符串 - 在您的情况下,这需要调用您的打印方法。

答案 1 :(得分:3)

System.out.println("Your name is "+print1()+" & your girlfriend's name is "+print2());

您确实调用了print1()和print2()。首先在括号中的Java进程代码,然后打印它。 它几乎像:

System.out.println(1+1);

它处理' 1 + 1'首先,然后再打印出来。

答案 2 :(得分:0)

当您呼叫显示时,显示调用print1和print2

display();

public void display(){
    System.out.println("Your name is "+print1()+" & your girlfriend's name is "+print2());

                                        ^^^                                       ^^^
}

在方法返回任何内容之前,将执行print1的操作

public String print1(){
    System.out.print("What is your name:");   // perform before return
    String a=input.next();
    return a;
}

因此,在从print1和print2返回任何内容之前,将执行其操作。

System.out.println("Your name is "+print1()+" & your girlfriend's name is "+print2());

的步骤
  

1)执行print1返回值println;在print2完成之前无法打印行

     

2)执行print2返回值println

     

3)打印行的返回值为print1print2

最终,println无法执行,因为它的性能基于对其他方法的调用。一旦这些方法完成了他们的操作,那么println就可以执行。