我正在学习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?
答案 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是一种基本数据类型,它们是按值而不是通过引用传递的,因此值保持不变:)