繁体   English   中英

在Java中将对象和原始数据作为参数传递有什么区别?

[英]what is the difference between passing an object and a primitive data as the parameter in Java?

对于将对象和原始数据作为Java参数传递之间的区别,我有些困惑。 我在这里读了一篇文章 ,解释说,当您传递原始数据时,您将复制该数据并将其传递,但​​是如果您传递一个对象,那么您将传递该对象引用。 我还阅读了该讨论,解释了Java中没有传递引用。 那么,上述两次通过之间的真正区别是什么?为什么Java处理它们的方式有所不同? 提前致谢。

传递基元和对象引用之间没有区别。 两者都按值传递。 在第一种情况下,将复制原始值。 在第二种情况下,将复制参考值。

需要明确的是,原始类型是通过值传递的,该类型的副本就是函数内部存在的副本。

不复制Object ,将对它的引用传递给函数。 这意味着您可以在函数内更改Object

但是,引用按值传递。 当该发布从函数中创建新的Dog时,引用的值将更改。 它不再是对传递给函数的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
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM