在此类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;
}
}
答案 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
。另一种方法是直接修改对象本身的成员变量,但这不是一回事。