仍然不确定为什么这个整数保持不变

时间:2015-05-12 07:38:32

标签: java types int

我正在学习Java中的References和Datatypes,这个特殊的代码仍然让我感到困惑。我知道Java中的所有原始类型都是值类型(byte,short,int,long,float,double,boolean,char),当你使用字符串或对象时,它是一个引用类型。当我被教导声明并初始化变量时,我被告知要把它想象成创建一个盒子。因此,如果我创建一个变量“y”并给它一个值“5”,就好像我创建了一个名为“y”的框,其中包含值5.我的老师说如果我然后尝试调用y方法(查看下面的代码以获取更多细节)值将保持不变,因为它是原始数据类型所以我只传入5,而不是CONTAINS 5的变量。我很困惑因为如果我传入值为5,为什么以下方法不会在其上添加一个。

public class ReferenceAndValueTypes {
    public static void main(String[] args) {

        int y = 5;
        addOneTo(y);

        System.out.println(y);

    }


    static void addOneTo(int number){
        number = number + 1;
    }
}

输出为5,这让我很困惑。老师说这是因为int是一个值类型所以我们没有传递y变量,我们不是在该变量上运行,而是在该变量的值上运行。但是,该变量的值是5,因为该方法增加了一个,不应该是6吗?或者,是因为y是一个值类型,该方法无法使用它,所以它只需打印出y的初始值为5?

5 个答案:

答案 0 :(得分:3)

Java原语(int,long,boolean等)不是引用,它们是实际值。当您有addOneTo(y);时,addOneTo会收到该值的副本。复制的值增加1,然后在方法退出时丢失。

作为类比,当您看到原始方法参数时,您可以将其视为复印机。相比之下,对象引用与将记事本写在其上的记事本相同。该方法将看到相同的对象,而不是它的副本,因此在方法退出后将对其进行更改。

更改参数名称可以使其更清晰

static void addOneTo(int numberA) {  // numberA is not the same as the int in the calling method, it's just an exact copy of it
    numberA = numberA + 1; // numberA is now incremented by one
    // method exits, numberA is lost
}

如果您想拥有一个提供增量功能的方法,您可以定义一个返回结果的方法。

public static void main(String[] args) {
    int x = 3;
    addOneTo(x); // x is still 3
    x = addOneTo(x); x is now 4
}

static int addOneTo(int number) {
    return number + 1;
}

答案 1 :(得分:0)

因为Java中的原始类型是按值传递的,而不是引用。内部addOne() i被视为从传递的参数复制的局部变量,因此其中的任何更改都不会更改调用者传递的变量。

P.S。这也适用于对象。例如,此代码段:

void changeString(String s) {
    s = new String("new");
}

String s = "old";
changeString(s);
System.out.println(s);  

打印"old",因为在changeString()中, s引用被复制,因此在方法中更改它(分配新引用)对调用者没有影响&# 39; s s变量。

答案 2 :(得分:-1)

就像它一样简单,java被写成pass-by-value。如果您在addOneTo方法中增加数字,那么您将更改参数编号的参考值。由此,该数字不再引用您原来的y变量,因此会增加它。这对任何原始类型都不起作用。

答案 3 :(得分:-1)

如果变量x包含引用类型,则它指向一个对象。如果它包含值类型,则它指向该值。当您调用某个函数f(x)时,传递给f的内容是x 指向而不是x本身。

所以在这里,如果你说的话

int y[] = new int[1]{5}

然后说

number[0] = number[0] + 1;

addOneTo内部,然后y的值将在外部修改--- addOneTo正在处理的事情是数组包含该内容号。

另一方面,当int y = 5时,你所做的事情是数字。您正在创建一个指向相同值(5)的新名称,以及当您说

number = number + 1;

你真正的意思是:

number2 = number + 1;
number = number2;

然后你扔掉了结果。

答案 4 :(得分:-1)

您的问题已经回答

int是一种基本数据类型,它们是按值而不是通过引用传递的,因此值保持不变:)