gpt4 book ai didi

Java并通过引用传递

转载 作者:行者123 更新时间:2023-11-30 07:13:05 27 4
gpt4 key购买 nike

我对 Java 不是很熟悉,我在摆弄一个简单的二叉树,遇到了一些我不明白的东西......

在以下代码段中,Add()AddHelper() 传递一个数字和对根节点 mRoot 的引用。但是,mRoot 始终为空,即使在第一次调用 AddHelper()

之后也是如此

但是,如果我更改 AddHelper() 使其直接使用 mRoot(而不是通过引用传入),那么它就可以工作...我不明白为什么/如何这样做在功能上会有任何不同。

Node mRoot;

public void Add( int num ) {
AddHelper(num, mRoot);
}

private void AddHelper( int num, Node node ){
// if I change 'node' to 'mRoot', it works. why?
if ( node == null ) {
node = new Node(num);
}
else {
...
}

最佳答案

假设您已在类里面将 mRoot 声明为 Node,那么我已经回答了您的问题。

java 始终按值传递 当您将mRoot 传递给您的方法时,您传递的是引用堆中对象的字节。例如,当您使用原始变量执行此操作时

int i =5;
int j=i;

存储在i中的字节被传输到j。同样,当你这样做时

Object obj = new Object();
Object newObj = obj;

存储在引用变量 obj 中的字节正在传输到引用 newObj。由于 obj 持有对 Object 实例的引用,因此 newObj 也持有相同的引用。

你可以看到

i = 5;
j=i;
j=10; // this doesn't change the i value

同样的方式

obj = new Object();
newObj = obj;
newObj = new Object(); // this doesn't change the obj

希望你明白。

编辑:

要回答您在评论中的问题,请考虑以下代码。

class Sample {
Object originalObj;
public static void main(String[] args) {
System.out.println(originalObj); // prints null

tryToCreateInstance(originalObj);
System.out.println(originalObj); // still prints null

createInstance(originalObj)
System.out.println(originalObj); // prints the object hashcode

originalObj = returnInstance(originalObj);//returns the same reference as originalObj
//is already initialized, if it had been null
// this would have returned a new object
System.out.println(originalObj); // prints the object hashcode
}

public void tryToCreateInstance(Object obj1){
if(obj1==null) {
obj1 = new Object(); // relate this with my answer above
// this wont change what originalObj refers
}
}

public void createInstance(){
if(obj==null) {
originalObj = new Object(); // refers to the instance variable originalObj
// hence will affect what originalObj refers
}
}

public Object returnInstance(Object obj1) {
if(obj1==null) {
return new Object(); // returns a new object
}
else {
return obj1;
}
}

}

关于Java并通过引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19804780/

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