-2

我写了一个代码 -

// Node Class
class aNode {

    // Node Contents
    int NodeInt;
    char NodeChar;

    // constructor
    aNode() {
    }

    aNode(int x, char y) {
        NodeInt = x;
        NodeChar = y;
    }
}

class MainClass {

    static aNode node = new aNode();

    public static void main(String[] args) {

        node = null;
        function(node);

        if (node == null) {
            System.out.println("Node is null");
        }
    }

    static void function(aNode x) {
        if (x == null) {
            System.out.println("Node is null");
        }

        x = new aNode(5, 'c');

        System.out.println(x.NodeInt);
        System.out.println(x.NodeChar);
    }
}

我预计输出是 -

Node is null
5
c

但是当程序返回到 main 时,node 的值又被设置为 null。所以我得到的输出是 -

Node is null
5
c
Node is null 

请帮我修改代码以获得所需的输出。任何帮助将不胜感激!

4

5 回答 5

3

你应该知道,那aNode nodeaNode x对不同对象的引用。它是 Java 功能之一 -按值传递。这意味着,当你打电话时

function(node);

您没有传递node对方法的引用function(...),而是创建了对同一对象的新引用。但是排队

x = new aNode(5,'c');

您正在设置x对新对象的引用。所以,node 仍然引用 null 和x引用 new aNode

要了解有关在 Java 中传递参数的更多信息,请阅读下一篇文章

引用数据类型参数(如对象)也按值传递给方法。这意味着当方法返回时,传入的引用仍然引用与之前相同的对象。但是,如果对象字段的值具有适当的访问级别,则可以在方法中更改它们。

于 2013-04-01T09:58:12.757 回答
0

您正在传递一个静态对象,但在方法 function() 中,您没有更改对象node的值。您仅更改其他对象的值。所以在 main 中,节点的值只有 null。

于 2013-04-01T09:58:03.133 回答
0

通常,这是因为 Java 会将 aNode 对象的引用副本传递给您的方法。更改此参考不会更改原始参考。

于 2013-04-01T09:58:07.057 回答
0

在 function() 内部,x 只是一个局部变量。当您在 Java 中重新分配引用时,您正在修改引用本身的内容,而不是被引用的对象之一。Java 中无法传递对象的地址。如果你想要这样的行为,你可以尝试使用像 Wrapper 这样的泛型类

于 2013-04-01T10:01:23.073 回答
0

在 Java 中,真正的传递引用是不可能的。Java 通过值传递所有内容,包括引用。. 因此,您必须稍微更改代码以获得所需的输出:

class aNode{

    //Node Contents
    int NodeInt;
    char NodeChar;

    //constructor
    aNode(){
    }
    aNode(int x, char y){
        NodeInt = x;
        NodeChar = y;
    }
}

class JavaApplication8{

    static aNode node = new aNode();

    public static void main(String[] args){


        node = null;
        node=function(node);

        if(node == null){
            System.out.println("Node is null");
        }
    }

    static aNode function(aNode x){
        if(x == null)
        {
            System.out.println("Node is null");
        }

        x = new aNode(5,'c');

        System.out.println(x.NodeInt);
        System.out.println(x.NodeChar);
        return x;
    }
}

输出:

Node is null
5
c
于 2013-04-01T10:01:30.097 回答