Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-避免通过引用传递_Java_Parameters_Reference - Fatal编程技术网

Java-避免通过引用传递

Java-避免通过引用传递,java,parameters,reference,Java,Parameters,Reference,我用Java制作了一个Line类,我还有一个drawing类,其中有一个方法可以将线条绘制到屏幕上;当我调用该方法时,它也会使直线居中,一旦该方法完成,它就会编辑原始直线的值 我想到的一个非理想的解决方案是取消线的中心位置以更改其值,但是在这个项目中,我有很多东西,而不仅仅是一条线和一个绘图类,我想知道一种永远避免这个问题的方法。在C++中,我知道你可以通过地址或指针来发送参数,据我所知,在java中你不能这样做,但是如果有类似的情况,那可能是最好的解决方案。 这是在屏幕上绘制线的方法的代码 p

我用Java制作了一个Line类,我还有一个drawing类,其中有一个方法可以将线条绘制到屏幕上;当我调用该方法时,它也会使直线居中,一旦该方法完成,它就会编辑原始直线的值

我想到的一个非理想的解决方案是取消线的中心位置以更改其值,但是在这个项目中,我有很多东西,而不仅仅是一条线和一个绘图类,我想知道一种永远避免这个问题的方法。在C++中,我知道你可以通过地址或指针来发送参数,据我所知,在java中你不能这样做,但是如果有类似的情况,那可能是最好的解决方案。 这是在屏幕上绘制线的方法的代码

public void drawLine(Line ln) {
    //I have used a new variable to try to avoid the problem, but it doesn't work.
    Line buf = new Line();
    buf.begin = ln.begin;
    buf.end = ln.end;

    buf.begin = centerPoint(buf.begin);
    buf.end = centerPoint(buf.end);
    gfx.drawLine((int) buf.begin.x, (int) buf.begin.y, (int) buf.end.x, (int) buf.end.y);
}
下面是我如何使用这条线

    Line ln = new Line(0, 0, 100, 0);
    draw.drawLine(ln);
    System.out.println(ln.begin.x + ", " + ln.end.x);
    //It should print 0, 0, but instead it prints out a different number, because it has been centered.

感谢您的帮助。

您的问题似乎是,
centerPoint
方法更改了
ln.begin
ln.end
实例的状态

您可以避免,如果
buf.begin
buf.end
是这些实例的副本,而不是引用它们

public void drawLine(Line ln) {
    Line buf = new Line();
    buf.begin = new Point(ln.begin); // I'm guessing the class name and available constructor
    buf.end = new Point(ln.end); // I'm guessing the class name and available constructor

    buf.begin = centerPoint(buf.begin);
    buf.end = centerPoint(buf.end);
    gfx.drawLine((int) buf.begin.x, (int) buf.begin.y, (int) buf.end.x, (int) buf.end.y);
}

您可以通过使用Java来避免“通过引用传递”,因为它不支持这一点。为什么要将这条线居中?看这个关于“Java是“按引用传递”还是“按值传递”的问题吗Clonable@texasbruce这是另一种选择,尽管有些人认为可克隆的界面坏了。它坏了吗?为什么呢它很久以前就出现在JRE中,从未被弃用过。我看不出他有什么优点。“语言外”这到底是什么意思?如果修改其中一个,其他的也会更改。突然间,你会有随机行为。是的,那是因为它是一个肤浅的复制品。界面没有损坏,但无论谁使用它都需要知道如何正确处理它。我如何使其可克隆?