为什么在将对象传递给函数时未设置引用

时间:2014-05-07 05:13:05

标签: java

我有两个课程如下 package com.test;

public class TestObject {
    private String id;
    private String name;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public void printValues() {
        System.out.println("ID    = "+id);
        System.out.println("Name  = "+name);
    }
}

package com.test;

public class Test {

    public void test1() {
        TestObject to = new TestObject();
        test2(to);
        to.printValues();

        TestObject to2 = null;
        to2 = test2(to2);
        to2.printValues();
    }

    public TestObject test2(TestObject _to) {
        if(_to == null) {
            _to = new TestObject();
            _to.setId("System ID");
            _to.setName("System Name : "+new java.util.Date());
        } else {
            _to = new TestObject();
            _to.setId("Some ID");
            _to.setName("Some Name : "+new java.util.Date());
        }
        return _to;
    }

    public static void main(String[] args) {
        Test test = new Test();

        test.test1();
    }
}

当我运行此代码时,我得到了以下输出

ID    = null
Name  = null
ID    = System ID
Name  = System Name : Wed May 07 10:38:22 IST 2014

如果对象为null,那么我不会从函数创建并从函数返回,所以为什么它会给我null?

请帮帮我

提前致谢。

3 个答案:

答案 0 :(得分:3)

您正在方法中创建一个新对象,因此您的旧对象未更新,请修改您的代码:

public void test1() {
    TestObject to = new TestObject();
    to = test2(to); // THIS line, to receive the object you created in test2()
    to.printValues();

    TestObject to2 = null;
    to2 = test2(to2);
    to2.printValues();
}

答案 1 :(得分:0)

在test2()函数中,即使对象不为null,也可以创建一个新对象。相反,您可以填充现有对象的字段。 只需更改以下代码:

public TestObject test2(TestObject _to) {
    if(_to == null) {
        _to = new TestObject();
        _to.setId("System ID");
        _to.setName("System Name : "+new java.util.Date());
    } else {
        // _to = new TestObject();  - Not needed as object is not null you can populate existing object
        _to.setId("Some ID");
        _to.setName("Some Name : "+new java.util.Date());
    }
    return _to;
}

答案 2 :(得分:0)

Java是按值传递的。如果修改任何从方法签名获得的对象将不会影响原始对象,除非为原始对象分配了修改后的对象。

更新您的代码,如下所示:

TestObject to = new TestObject();
to = test2(to); 
to.printValues();

请参阅This