任何人都可以帮我理解这两个程序吗?

时间:2017-03-12 18:12:27

标签: java

计划1:

public class ValAndRefTypes {

public static void main(String[] args) {
    int x=5;
    addOneTo(x);
    System.out.println(x);

}

static int addOneTo(int num){
    num=num++;
    return(num);//Outputs 5
}

计划2:

public class ValAndRefType1 {

public static void main(String[] args) {
    int a=2,b=3;
    System.out.println("The sum is: " + Add(a,b));
}

 static int Add(int num,int num1){
    num++;
    num1++;
    return(num+num1); //Outputs 7
}

为什么第一个程序不输出变量'x'的递增值,但第二个程序输出变量'a'和'b'的递增值?

我还想问一下这是否与Value类型和Reference类型有任何关系。

TIA答案!

3 个答案:

答案 0 :(得分:1)

有两个原因:

<强>首先

在第一个程序中,addOneTo函数正在添加值并返回新值(好吧,尝试,但我们将在下面得到),但忽略了返回值: / p>

addOneTo(x);

您不会将新值分配给任何内容。将其分配回变量:

x = addOneTo(x);

而在第二个程序中,这是有效的,因为 使用返回的值。您将其作为输出的一部分包含在内:

System.out.println("The sum is: " + Add(a,b));

<强>第二

这一行非常误导,并且使正在实施的逻辑混乱:

num=num++;

num++增加num,但评估以前的num值。因此,分配会导致返回先前的值。这可以改为:

num = ++num;

虽然这仍然无缘无故地掩盖逻辑。直接增加:

num++;

或者如果您更喜欢更明确:

num = num + 1;

在第二个例子中,这是你增加的方式:

num++;
num1++;

答案 1 :(得分:0)

在第一个程序中,您正在打印具有值5的“x”。仅调用函数不会更改“x”的值。如果要打印递增值,程序将如下所示:

public class ValAndRefTypes {

public static void main(String[] args) {
int x=5;
System.out.println(addOneTo(x));

}

static int addOneTo(int num){     NUM = NUM​​ ++;     return(num); //返回6而不是5 }

答案 2 :(得分:-1)

让我对程序1做一个小改动。你不能改变原语。

public static void main(String[] args) {
    int x=5;
    int y = addOneTo(x);
    System.out.println(y);
}

static int addOneTo(int num){
    num=num++;
    return(num);
}