创建变量的别名/引用(JAVA)

时间:2015-11-04 14:14:51

标签: java reference

我使用了很多C ++,我对Java的工作方式很困惑: 如果我有一个班级

public void doInsert(String word, java.sql.Timestamp ourJavaTimestampObject, int userID , String child) {
        try {

            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection(url, user, pass);
            Statement st = con.createStatement();
            st.executeUpdate("\n" +
                    "INSERT IGNORE INTO FLAGS (FLAG_WORD, FLAG_DATE, FLAG_USER, FLAG_CHILD)\n" +
                    "VALUES  ('" + word + "' , '" + ourJavaTimestampObject + "' , '" + userID + "','" + Register.child + "')");


            con.close();        

        } catch (SQLException ex) {

        } catch (ClassNotFoundException e) {

        }

    }// end method insert

然后我想在其他地方使用我的变量:

public class MyClass{
    private int[] myVariable;
     ...

    public int[] getVar(){
        return myVariable;
    }
}

是临时副本还是myVariable的引用?

如何获得副本/参考资料?

4 个答案:

答案 0 :(得分:4)

您的示例中只有一个 Here is my code. Have a look. @IBAction func playAndPauseButtonClicked(sender: AnyObject) { let skView = self.view as! SKView skView.scene!.paused = true if (playAndPauseButton.currentImage == UIImage(named: "play.png")) { playAndPauseButton.setImage(UIImage(named: "pause.png"), forState: UIControlState.Normal) } else { playAndPauseButton.setImage(UIImage(named: "play.png"), forState: UIControlState.Normal) skView.scene!.paused = false } } Note: I used this in a sample game where I have button which pause and play the game scene. 。完全没有复制。方法int[]返回的是对象的引用。

行后

getVar

int[] temp = myObject.getvariable(); temp都是对同一对象的引用。您可以通过以下方式测试: myVariable。这两个地方都可以看到变化。

如果要复制数组,可以使用temp[0] = 9;array.clone()Arrays.copyOf(array, array.length)中的一个,但在您的示例中不使用这些数组。

答案 1 :(得分:3)

这让你感到困惑,因为与C不同,Java只是按值传递。所以你不会引用那个对象,但只有一个副本,然后如果你对该变量进行任何修改,原件就不会受到影响。有关详细信息,请参阅此问题:Is Java "pass-by-reference" or "pass-by-value"?

修改

更具体地说,在您的示例中,您实际上会获得数组的引用。但是,这仍然不像C指针。您只能获得引用,因为您复制它的实际值是引用本身。正如我所说,你可以在上面的链接上找到更详细的解释。

答案 2 :(得分:2)

我可以看到令你困惑的是什么,让我给你看一个例子。

<强> MyClass.java

public class MyClass {
    private int i;
    private int[] a;

    public void setI(int i){
        this.i = i;
    }
    public void setA(int a[]){
        this.a = a;
    }

    public int getI(){
        return i;
    }
    public int[] getA(){
        return a;
    }
}

<强> Test.java

public class Test {

    public static void main(String[] args) 
    {
        int a[] = {1,2};
        MyClass myClass = new MyClass();
        myClass.setI(5);
        myClass.setA(a);

        int i = myClass.getI();
        int b[] = myClass.getA();

        System.out.println(myClass.getI());
        System.out.println(myClass.getA()[0] + " " +myClass.getA()[1]);

        i = 10;
        b[0] = 3;
        b[1] = 4;

        System.out.println(myClass.getI());
        System.out.println(myClass.getA()[0] + " " +myClass.getA()[1]);
    }
}

当您看到上述代码的输出时,您将意识到,像整数这样的原始类型总是通过Java中的值传递。但是当您传递数组或其他对象(如Calendar类的对象)时,它将通过引用传递。

因此,更改数组的值将反映在两个整数的位置,不会。

任何建议均可接受此答案。如果有人发现任何不准确之处,请随时建议编辑。

答案 3 :(得分:1)

您的类MyClass中存在错误,您将遇到编译错误类型不匹配:无法从int []转换为double。你必须将你的方法的返回类型更改为int [],如:

public int[] getVar(){
return myVariable;

}

JAVA始终是按值传递