gpt4 book ai didi

java - Java中的指针类型

转载 作者:行者123 更新时间:2023-12-01 22:43:22 25 4
gpt4 key购买 nike

我正在尝试执行以下操作:

import java.util.ArrayList;


public class One {

private ArrayList<Integer> list;

public One() {
addString(list);
sysoutList(list);
}

public void sysoutList(ArrayList<Integer> list2) {
for (int i = 0; i < list2.size(); i++) {
System.out.println(list2.get(i));
}
}

private void addString(ArrayList<Integer> list2) {
list2 = new ArrayList<>();
list2.add(1);
list2.add(2);
list2.add(3);
list2.add(4);
}

}

问题是,sysoutList() 抛出 NullPointerException,因为 list2 为 null。看起来,addString() 中 list 的初始化没有任何效果,因为无法引用类变量。在 C++ 中,我会用指针解决这个问题,但在 Java 中如何做到这一点?

最佳答案

永远记住Java is pass by value .

如果您在方法内重新实例化变量,则传递的变量将保持不变。您的示例正是这样做的。

String myValue = "All your variables belong to us";

setValue(myValue);

System.out.println(myValue); //All your variables belong to us

void setValue(String v){
v = "Hello World!";
}

您应该首先初始化变量:

import java.util.ArrayList;


public class One {

private ArrayList<Integer> list = new ArrayList<Integer>();

public One() {
addString(list);
sysoutList(list);
}

public void sysoutList(ArrayList<Integer> list2) {
for (int i = 0; i < list2.size(); i++) {
System.out.println(list2.get(i));
}
}

private void addString(ArrayList<Integer> list2) {
list2.removeAll();
list2.add(1);
list2.add(2);
list2.add(3);
list2.add(4);
}

}

列表是一种特殊情况。您可能会认为使用 add() 方法实际上是在修改变量,因此不应发生修改。这不是真的,为什么?

这是因为您正在传递列表的引用值。如果您使用 new 为该引用分配新值关键字,您“释放”了附加到它的对象(您不再拥有它的引用)。

但是,如果您修改该对象的属性(例如使用 add() 方法),则该对象的引用仍然有效,因此您修改了原始对象。

我们可以打个比方。

想象一下你有一只卡在绳子上的风筝。现在,您向其附加一个新字符串,并将新创建的字符串传递给 friend 。

如果他剪断了绳子(也就是创建了 new 绳子),他就会失去对你的风筝的引用,并且他无法够到它。他可以附加一个新风筝并进行所有他想要的修改(又名 add() 一些东西),但它永远不会是的风筝。

如果他使用您给他的绳子来接触风筝并对其进行修改,您将收到经过修改的风筝。

为了保持您的情况的相似性,您将使用 list 创建一个没有风筝的字符串( private ArrayList<Integer> list; )。然后将其传递给您的 friend ,创建一个新字符串( list2 )。现在你和你的 friend 都有一根没有任何附加物的绳子。

他创造了一个新风筝并将其卡在他的绳子上( list2 = new ArrayList<>() ),但你的绳子仍然没有卡在任何东西上。当您尝试放风筝时,您会发现风筝根本不存在(null引用)。

首先,您必须创建自己的风筝并系上绳子( private ArrayList<Integer> list = new ArrayList<Integer>(); )。当您将其传递给您的 friend 时,会附加另一个字符串( list2 )。现在您的 friend 可以使用list2修改你的风筝。

编辑

关于您的其他问题,如果可以在从构造函数调用的方法中实例化变量,那么答案是,但此类变量必须声明为static如果您想在方法之外使用它。

在风筝中,这就像您将风筝卡在一根绳子上,然后您和您的 friend 使用同一根绳子对其进行操作(是的,手牵着手)。

对你来说变成:

import java.util.ArrayList;


public class One {

private static ArrayList<Integer> list;

public One() {
addString();
sysoutList();
}

public void sysoutList() {
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}

private void addString() {
list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
}

}

您不需要传递ArrayList因为您在程序中的任何地方都使用相同的“风筝线”。

注意:如果您调用 sysoutList() 之前 addString()您仍然会得到 NullPointerException因为列表尚未初始化。

这是一个不好的做法。我强烈建议你改变你的逻辑。

关于java - Java中的指针类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25760971/

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