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

Still unsure as to why this integer remains unmodified

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

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?

因为 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 引用 被复制,因此在方法内部更改它(分配新引用)对调用者的 s 变量没有影响。

虽然简单,java写成pass-by-value。如果您在 addOneTo 方法中增加数字,那么您正在更改参数编号的引用值。这样,该数字不再引用您原来的 y 变量,因此会增加它。这不适用于任何原始类型。

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

打个比方,当你看到一个原始的方法参数时,你可以把它想象成一台复印机。相比之下,对象引用与传递上面写有内容的记事本相同。该方法将看到相同的对象,而不是它的副本,因此对它所做的更改将在该方法退出后出现。

更改参数的名称可以使这一点更清楚

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
}

如果您想要一种提供递增功能的方法,您可以定义一个 returns 结果。

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;
}

如果一个变量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;

然后你扔掉结果。

你的问题有答案

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