在 Java 中将对象和原始数据作为参数传递有什么区别?
what is the difference between passing an object and a primitive data as the parameter in Java?
我对在 Java 中将对象和原始数据作为参数传递的区别有点困惑。我读到 post here explaining that when you pass a primitive data, you copy that data and pass it, but if you pass an object then you pass by the object reference. And I also read this discussion 解释说 Java 中没有传递引用。那么,以上两遍之间的真正区别是什么?为什么 Java 以不同的方式处理它们?提前致谢。
传递基元和对象引用之间没有区别。两者都是按值传递的。在第一种情况下,原始值被复制;在第二种情况下,参考值被复制。
传递原语时,实际上传递的是该变量值的副本。这意味着在被调用方法中所做的更改不会反映在原始变量中。
当您传递对象时,您不会传递副本,而是传递该对象的 'handle' 副本,您可以通过该副本访问和更改它。这个'handle'是一个'reference'。在此更改将反映在原始文件中。
现在有一件事,当你传递原始类型的数组变量时会发生什么。在这种情况下,您不会传递副本,所做的更改将反映在原始副本中。
需要明确的是,基本类型是按值传递的,类型的副本存在于函数内部。
未复制 Object
,将对它的引用传递给函数。这意味着您可以在函数内更改 Object
。
但是,引用是按值传递的。当该发布从函数内创建一个新的 Dog
时,引用的值会发生变化。它不再是对传递给函数的 Dog
的引用,而是对新的
的引用。
只是为了澄清目前的回复
public class Car {
private String type;
public Car(String type) {
this.type = type;
}
public void setType(String type) {
this.type = type;
}
public static void foo(Car someCar) {
Car newCar = new Car("Sedan");//new object created
someCar = newCar; //passed reference also points to newly created object
someCar.setType("Coupe");//Referred object changes
System.out.println(newCar.type);//Coupe
System.out.println(someCar.type);//Coupe
}
public static void main(String[] args) {
Car myCar = new Car("Sports");//new object created
foo(myCar);//reference is passed by value
System.out.println(myCar.type);//Sports
}
}
我对在 Java 中将对象和原始数据作为参数传递的区别有点困惑。我读到 post here explaining that when you pass a primitive data, you copy that data and pass it, but if you pass an object then you pass by the object reference. And I also read this discussion 解释说 Java 中没有传递引用。那么,以上两遍之间的真正区别是什么?为什么 Java 以不同的方式处理它们?提前致谢。
传递基元和对象引用之间没有区别。两者都是按值传递的。在第一种情况下,原始值被复制;在第二种情况下,参考值被复制。
传递原语时,实际上传递的是该变量值的副本。这意味着在被调用方法中所做的更改不会反映在原始变量中。
当您传递对象时,您不会传递副本,而是传递该对象的 'handle' 副本,您可以通过该副本访问和更改它。这个'handle'是一个'reference'。在此更改将反映在原始文件中。
现在有一件事,当你传递原始类型的数组变量时会发生什么。在这种情况下,您不会传递副本,所做的更改将反映在原始副本中。
需要明确的是,基本类型是按值传递的,类型的副本存在于函数内部。
未复制 Object
,将对它的引用传递给函数。这意味着您可以在函数内更改 Object
。
但是,引用是按值传递的。当该发布从函数内创建一个新的 Dog
时,引用的值会发生变化。它不再是对传递给函数的 Dog
的引用,而是对新的
只是为了澄清目前的回复
public class Car {
private String type;
public Car(String type) {
this.type = type;
}
public void setType(String type) {
this.type = type;
}
public static void foo(Car someCar) {
Car newCar = new Car("Sedan");//new object created
someCar = newCar; //passed reference also points to newly created object
someCar.setType("Coupe");//Referred object changes
System.out.println(newCar.type);//Coupe
System.out.println(someCar.type);//Coupe
}
public static void main(String[] args) {
Car myCar = new Car("Sports");//new object created
foo(myCar);//reference is passed by value
System.out.println(myCar.type);//Sports
}
}