Java 当我使用int的对象形式时,为什么这个代码段中的输出没有改变?
给定此代码段:Java 当我使用int的对象形式时,为什么这个代码段中的输出没有改变?,java,Java,给定此代码段: class Ex1{ public static void main(String args[]){ int x = 10; int y = new Ex1().change(x); System.out.println(x+y); } int change(int x){ x=12; return x; } } 我知道change方法不会更改main中的x,并返回值22,因为Java原语是按值调用的。但是,如果我将所有的int更改为Intege
class Ex1{
public static void main(String args[]){
int x = 10;
int y = new Ex1().change(x);
System.out.println(x+y);
}
int change(int x){
x=12;
return x;
}
}
我知道change
方法不会更改main
中的x
,并返回值22
,因为Java原语是按值调用的。但是,如果我将所有的int
更改为Integer
,使它们成为对象,因此理论上按引用值调用,为什么程序仍然返回22
是否可以修改方法change
,使其同时修改main
中的变量x
编辑:新代码段
class Ex1{
public static void main(String args[]){
Integer x = 10;
Integer y = new Ex1().change(x);
System.out.println(x+y);
}
Integer change(Integer x){
x=12;
return x;
}
}
因为这不会更改对象整数x
中存储的内容,而是为变量x
指定一个新值。更改的不是原始参数对象,而是为原来保存原始对象的变量创建了一个新的Integer
对象
因为这不会更改对象整数x
中存储的内容,而是为变量x
指定一个新值。更改的不是原始参数对象,而是为原来保存原始对象的变量创建了一个新的Integer
对象
因为这不会更改对象整数x
中存储的内容,而是为变量x
指定一个新值。更改的不是原始参数对象,而是为原来保存原始对象的变量创建了一个新的Integer
对象
因为这不会更改对象
整数x
中存储的内容,而是为变量x
指定一个新值。更改的不是原始参数对象,而是为原来保存原始对象的变量创建了一个新的Integer
对象。正如您所说,将对象传递给函数时,实际上是传递其引用的值。因此,像myParam=something
这样的语句对传递给方法的对象没有影响,只有像myParam.mutate()
这样的方法调用才能更改其状态。尽管如此,Integer
是一个不可变的类,因此您无论如何都不能更改Integer
的主值。正如您所说,将对象传递给函数时,实际上是传递其引用的值。因此,像myParam=something
这样的语句对传递给方法的对象没有影响,只有像myParam.mutate()
这样的方法调用才能更改其状态。尽管如此,Integer
是一个不可变的类,因此您无论如何都不能更改Integer
的主值。正如您所说,将对象传递给函数时,实际上是传递其引用的值。因此,像myParam=something
这样的语句对传递给方法的对象没有影响,只有像myParam.mutate()
这样的方法调用才能更改其状态。尽管如此,Integer
是一个不可变的类,因此您无论如何都不能更改Integer
的主值。正如您所说,将对象传递给函数时,实际上是传递其引用的值。因此,像myParam=something
这样的语句对传递给方法的对象没有影响,只有像myParam.mutate()
这样的方法调用才能更改其状态。尽管如此,Integer
是一个不可变的类,因此您无论如何都无法更改主要Integer
的值。在Java中,值和引用类型都是按值传递的(请参阅)。这意味着传入的引用仍然指向调用之前的同一对象,即使方法的内部更改了分配给方法参数变量的引用
它们都是引用类型,因此当作为参数传递给方法时,它们的行为与任何其他引用类型的行为没有区别
但是,您可以更改引用对象内的值,这些更改将在方法调用完成后反映在调用方法中。但是,您不能使用原始包装器实现这一点:它们是不可变的
public static void main(String[] args){
Foo parentFoo = new Foo(1);
System.out.println(parentFoo); // prints "instance 1, data is now 1"
changeReferenceFail(parentFoo); // prints "instance 2, data is now 2"
System.out.println(parentFoo); // prints "instance 1, data is now 1"
mutateReference(parentFoo); // prints "instance 1, data is now 3"
System.out.println(parentFoo); // prints "instance 1, data is now 3"
}
private static void changeReferenceFail(Foo myFoo) {
myFoo = new Foo(2); // assigns a new object to the myFoo parameter variable
System.out.println(myFoo);
}
private static void mutateReference(Foo myFoo) {
myFoo.setData(3); // changes the reference variable internals
System.out.println(myFoo);
}
...
class Foo {
private static int iidSeed = 0;
private int iid = 0;
private int data;
public Foo(int data) {
this.data = data;
this.iid = ++iidSeed;
}
public void setData(int data) { this.data = data; }
public String toString() {
return String.format("instance %d, data is now %d", this.iid, this.data);
}
}
您问:“是否可以修改方法更改,使其同时修改main中的变量x?”
您可以传递引用对象,也可以修改内部字段(按照上面的
mutaterereference
)。或者,您可以返回一个新的整数,并将其完全指定给本地变量。在Java中,值和引用类型都是按值传递的(请参阅)。这意味着传入的引用仍然指向调用之前的同一对象,即使方法的内部更改了分配给方法参数变量的引用
它们都是引用类型,因此当作为参数传递给方法时,它们的行为与任何其他引用类型的行为没有区别
但是,您可以更改引用对象内的值,这些更改将在方法调用完成后反映在调用方法中。但是,您不能使用原始包装器实现这一点:它们是不可变的
public static void main(String[] args){
Foo parentFoo = new Foo(1);
System.out.println(parentFoo); // prints "instance 1, data is now 1"
changeReferenceFail(parentFoo); // prints "instance 2, data is now 2"
System.out.println(parentFoo); // prints "instance 1, data is now 1"
mutateReference(parentFoo); // prints "instance 1, data is now 3"
System.out.println(parentFoo); // prints "instance 1, data is now 3"
}
private static void changeReferenceFail(Foo myFoo) {
myFoo = new Foo(2); // assigns a new object to the myFoo parameter variable
System.out.println(myFoo);
}
private static void mutateReference(Foo myFoo) {
myFoo.setData(3); // changes the reference variable internals
System.out.println(myFoo);
}
...
class Foo {
private static int iidSeed = 0;
private int iid = 0;
private int data;
public Foo(int data) {
this.data = data;
this.iid = ++iidSeed;
}
public void setData(int data) { this.data = data; }
public String toString() {
return String.format("instance %d, data is now %d", this.iid, this.data);
}
}
您问:“是否可以修改方法更改,使其同时修改main中的变量x?”
您可以传递引用对象,也可以修改内部字段(按照上面的
mutaterereference
)。或者,您可以返回一个新的整数,并将其完全指定给本地变量。在Java中,值和引用类型都是按值传递的(请参阅)。这意味着传入的引用仍然指向调用之前的同一对象,即使方法的内部更改了分配给方法参数变量的引用
class Ex1{
int x = 10;
public static void main(String args[]){
System.out.println(x);
changeX(15);
System.out.println(x);
}
void changeX(int newVal){
x=newVal;
}
}