gpt4 book ai didi

java - JAVA中本地对象的创建

转载 作者:行者123 更新时间:2023-11-30 04:05:33 25 4
gpt4 key购买 nike

我正在写一些我在学校收到的 JAVA 作业几天了,我遇到了一些很奇怪的事情(嗯,至少对我来说是......)。
由于该问题与我的项目无关,因此我编写了一些代码来呈现我想要询问的行为,因此请忽略您在以下代码中可能遇到的与此特定问题无关的任何问题。
考虑下面的类:

package test;

import java.util.ArrayList;
import java.util.List;

public class Car {

List<Doors> doors;
int numOfDoors;

public Car(int numOfDoors) {
this.numOfDoors=numOfDoors;
}

public void prepare() {
run(doors);
}

public void run(List<Doors> listOfDoors) {
listOfDoors=new ArrayList<Doors>(numOfDoors);
}

public List<Doors> getDoors() {
return doors;
}
}

还有这个:

package test;

import java.util.List;

public class TestDrive {

public static void main(String[] args) {

Car car=new Car(5);
car.prepare();
List<Doors> listOfDoors=car.getDoors();

if (listOfDoors==null) {
System.out.println("This is not the desired behaviour.");
}
else {
System.out.println("This is the desired behaviour.");
}
}
}

我同意,这有点愚蠢,没有意义,但再说一次 - 我写它只是为了满足我的好奇心。

现在,正如您可能已经猜到的那样,输出是“这不是所需的行为。”,这意味着字段“doors”持有一个空指针,即使它在“run()”中分配了一个新对象“方法。所以我的问题是为什么?为什么它是空的?
我的意思是,我知道创建一个局部变量——可能是一个基元、一个对象或对一个对象的引用——会导致当我们离开方法的范围时失去它,但这里的情况并不完全是这样,因为那里是对新创建的对象(门)的实时引用,那么为什么JAVA会销毁它呢?

最佳答案

让我们一步步分析一下。

Car car=new Car(5);
car.prepare();

您创建了一辆新车,并希望在准备之后它有一个包含 5 个门的列表。现在让我们看看准备期间发生了什么。

public void prepare() {
run(doors);
}

public void run(List<Doors> listOfDoors) {
listOfDoors=new ArrayList<Doors>(numOfDoors);
}

新的 ArrayList 被分配给局部变量 listOfDoors。当您编写 run(doors) 时,您没有传递一个指向变量 doors 的指针,正如您在 C 上下文中所期望的那样,对于实例。您将 null(因为 doors 尚未初始化)传递给 run 方法。

运行开始时,我们有

List<Doors> listOfDoors = null;

这是在调用时传递null 引用的结果。然后,您将一个新列表分配给该局部变量,只有在该方法终止时才会被销毁。如您所见,没有为 doors 分配任何内容,导致出现意外行为。

要解决此问题,请删除 run 方法并重写 prepare 方法。

public void prepare() {
doors = new ArrayList<Doors>(numOfDoors);
}

有了这个,您应该得到预期的行为。

关于java - JAVA中本地对象的创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20829005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com