创建并返回同一对象的副本

时间:2015-03-23 04:22:59

标签: java copy this clone

在此类Coord中,方法public Coord copy()应创建并返回一个新的Coord值,该值与当前对象具有相同的行/列表示。当我this = clone时,为什么它会给我错误?

public class Coord {

    public final int r;
    public final int c;


    public Coord(int r, int c)
    {
        this.r = r;
        this.c = c;
    }

    public Coord step(Direction d)
    {
        if(d == Direction.N)
        {
            Coord newValue = new Coord(r + 1, c);
            return newValue;
        }
        else if(d == Direction.S)
        {
            Coord newValue = new Coord(r - 1, c);
            return newValue;
        }
        else if(d == Direction.E)
        {
            Coord newValue = new Coord(r, c + 1);
            return newValue;
        }
        else if(d == Direction.W)
        {
            Coord newValue = new Coord(r, c - 1);
            return newValue;
        }

        else
            return this;

    }

    public Coord copy()
    {
        Coord clone = new Coord(r, c);
        this = clone;
        return clone;

    }


}

2 个答案:

答案 0 :(得分:1)

我想你想这样做:

public Coord copy() {
    Coord clone = new Coord(r, c);
    return clone;
}

在这种情况下,它甚至可以缩短为:

public Coord copy() {
    return new Coord(r, c);
}

this keyword是对当前对象的引用(在本例中是当前的Coord对象),Java不允许您为{{1}分配新值}。如果要制作副本,则只需创建新对象并返回该新对象。


也许这样会有所帮助。

您可能正在以这种方式使用this的{​​{1}}方法制作副本:

Coord

如果copy()工作正常,您可能希望int x = ...; //x is some int int y = ...; //y is some int Coord coordOriginal = new Coord(x, y); //coordOriginal points to a new Coord object. Let's call it "A". Coord coordCopy = coordOriginal.copy(); //coordCopy points to to a new Coord object. Let's call it "B". //coordOriginal still points to Coord object "A". copy()指向两个不同的对象。 coordOriginal指向coordCopy对象 A coordOriginal指向Coord对象 B

现在让我们假装您可以像示例代码的coordCopy方法一样为Coord分配一个新值:

this

所以你看,如果你可以在copy()方法中为//in this case, "this" points to object "A". public Coord copy() { //creates an object "B" Coord clone = new Coord(r, c); //***overwrites object "A" with object "B"!*** this = clone; //returns object "B" return clone; } //object "A" gets garbage collected? 分配一个新对象(并且Java不会让你),那么你将改变原来的{{1}当你想要做的就是复制时,对象就是对象!


如问题评论中所述,另一种方法是制作复制构造函数:

this

然后你可以制作这样的副本:

copy()

答案 1 :(得分:0)

首先,this是关键字,而不是变量,因此分配关键字并不合理。

在第二个实例中,您无法分配给this,因为在Java中它被禁止,this指的是您调用当前方法的对象,尽管它可能是技术上的可能,这是不允许的。

要获得相同的功能,您必须从方法外部或通过访问容器将对象存储的位置重新分配给新创建的Coord。另一种方法是直接修改对象本身的成员变量,但这不是一回事。