java中的意外输出

时间:2013-04-01 09:53:36

标签: java

我写了一段代码 -

// 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 

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

5 个答案:

答案 0 :(得分:3)

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

function(node);

您没有将node引用传递给方法function(...),而是要创建对同一对象的新引用。但是在行

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

您正在为新对象设置引用x。因此,node 仍然引用了对新x的null和aNode引用。

要了解有关在Java中传递params的更多信息,请read next article

  

也会传入参考数据类型参数,例如对象   方法的价值。这意味着当方法返回时,   传入引用仍引用与以前相同的对象。   但是,可以在中更改对象字段的值   方法,如果他们有适当的访问级别。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

在函数()中,x只是一个局部变量。在Java中重新分配引用时,您正在修改引用本身的内容,而不是引用的引用内容。 Java中没有办法传递对象的地址。如果您想要这样的行为,可以尝试使用Wrapper等通用类

答案 4 :(得分: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