Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我使用int的对象形式时,为什么这个代码段中的输出没有改变?_Java - Fatal编程技术网

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