java - 在 Java 中传递对象并尝试以多种方式更改它们
问题描述
我对 Java 如何按值传递以及如何将对象传递给方法可以更改对象的字段(例如 Car 类中的 change1() )有所了解。
但是,我的问题是为什么 change2() 和 change3() 没有改变任何东西(尤其是 change3())
public class question {
public static void main(String[] args)
{
Car c1 = new Car(1000,"Hyundai");
Car c2 = new Car(2000,"BMW");
c1.change3(c1);
c1.change3(c2);
System.out.println(c1.name + " "+ c1.price );
System.out.println(c2.name + " " + c2.price);
}
}
class Car
{
int price;
String name;
Car(int p , String n)
{
this.price=p;
this.name=n;
}
void change1(Car c)
{
c.price=0;
c.name="Changed";
}
void change2(Car c)
{
c = new Car(999,"Honda");
}
void change3(Car c)
{
c = new Car(888,"Audi");
c.price=80;
c.name="xxx";
}
}
解决方案
每次 JVM 执行new
运算符时,都会创建一个新的对象/实例。您正在方法中创建Car 类型的新对象change3(Car c)
,并将对该对象的引用存储到局部变量c
中。在此之后,您设置的任何内容c
都是修改新对象,而不是您传递引用的对象。
void change3(Car c) //receives the reference to the object you pass;
{
c = new Car(888,"Audi"); //creates a new Car object and assigns reference to that **new object** to the variable c.
c.price=80; //here, you're changing the price/name fields of different object.
c.name="xxx";
}
请注意,在change1(Car c)
你没有创建一个新对象,但在change2(Car c)
和change3(Car c)
- 你确实[明确地]创建新对象。
推荐阅读
- java - 在 Kotlin Android(最低 Android 版本 21)中从 24 小时格式转换为 12 小时格式时,从 12:00 到 12:59 的 AM/PM 值错误
- palantir-foundry - 在 Palantir 报告中:如何查看超过 30 天的观看人数?
- python - 为什么 python 在 NumPy 数组上使用“/=”赋值时会抛出“true_divide”类型错误?
- database - 在多台计算机上计算素数
- python - Scrapy response.xpath如何获取数字输出
- python-3.x - 为 Django 项目运行 pipenv 安装时出现错误“找不到 django-supervisor==0.4.0 的匹配分发”
- javascript - jQuery:如何将特定 DIV 下的 3 个“h3”元素的最大高度设置为所有 h3 元素?
- reactjs - 如何添加与基础具有相同前缀的所有(*)路由?
- javascript - 读取每个上传文件的缓冲区属性,当有多个时
- javascript - ejs 不会呈现 Html 页面