Java:在方法中传递变量空,但在构造函数中没有

时间:2013-08-03 13:11:04

标签: java constructor hashset

我正在努力在两个类之间传递数据。在ClassOne中,我基于GUI的用户输入构建了一个HashSet,然后我想通过引用传递给ClassTwo。

问题是我的方法运行时变量是空的,但不是在构造函数中。以下是我正在做的简化版本。

ClassOne

public class ClassOne
{
    HashSet<String> extensions;

    // run this when the button is clicked
    class startListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            // run the method to populate the hashset
            parseExt();
            // create a new class passing HashSet
            classTwo = new classTwo(extensions);
        }
    }

    // populates HashSet
    public void parseExt()
    {
        extensions = new HashSet<String>();

        extensions.add("foo");
        extensions.add("bar");
        extensions.add("bat");
    }
}

ClassTwo

public class ClassTwo implements Runnable
{
    HashSet<String> extensions;

    public ChgOwner(HashSet<String> extensions)
    {
        this.extensions = extensions;
        // prints [foo, bar, bat]
        System.out.println(this.extensions);
    }

    public void run()
    {
        // prints []
        System.out.println(this.extensions);
    }

关于我做错了什么的想法?

=======

编辑:为了尝试澄清,变量扩展正通过ClassTwo的构造函数从ClassOne传递到ClassTwo。在构造函数中,我将值分配给ClassTwo中的属性,也称为扩展。在ClassTwo的构造函数中,我可以打印扩展的值,结果为“[foo,bar,bat]”。但是当在ClassTwo中的run()方法中打印值时,HashSet为空并输出“[]”。

我的问题是为什么ClassTwo的“extensions”属性在方法中是空的,而不是在构造函数中?

2 个答案:

答案 0 :(得分:2)

我希望在你将hashset传递给classtwo后,classone会再次修改它(也许会调用clear())。

答案 1 :(得分:1)

你说:

  

编辑:为了尝试澄清,变量扩展正在从ClassOne传递到ClassTwo,通过ClassTwo的构造函数。在构造函数中,我将值分配给ClassTwo中的属性,也称为扩展。在ClassTwo的构造函数中,我可以打印扩展的值,结果为“[foo,bar,bat]”。但是当在ClassTwo中的run()方法中打印值时,HashSet为空并输出“[]”。

     

我的问题是为什么ClassTwo的“extensions”属性在方法中是空的,而不是在构造函数中?

jtahlborn已经发布并删除了答案。

既然您确定使用填充了相关数据的HashSet创建了Class2实例,并且稍后看到数据消失了,这只能意味着jtahlborn建议您删除数据从HashSet 之后创建Class2实例。

要理解的关键概念是,当您将HashSet参数传递给Class2构造函数时,您将引用传递给位于Class1中的原始HashSet。对原始对象所做的任何更改都将在对该对象的所有引用中看到。如果您不希望这种情况发生,那么您需要传入HashSet的副本

尝试做:

classTwo = new classTwo(new HashSet<String>(extensions));

由于字符串是不可变的,因此不需要做比这更深的复制。如果您的HashSet包含可变对象,则情况并非如此。