重写toString方法

我使用.toString来返回对象的字符串表示,即

jcb.engineMove(move.toString()); 

将产生e2e4。

我想要做的是将此对象(e2e4)的文本提取为字符串。 谷歌搜索后,我遇到了覆盖toString方法,所以我想出了这个:

 @Override public String toString() { String s = ""; int newRank = getRank(); int newFile = getFile(); final Move move = new Move(rank, file, newRank, newFile); s+="" + move; return s; } 

我的问题很基础:

  1. 这是正确的方法
  2. 在尝试获取对象的文本时如何调用此例程?

重写Object.toString是一种很好的方法。

但是 ,您当前的实现通过创建新的Move对象而产生了一个重大错误(见下文)。

要调用例程(一旦修复它),请完成您已经在做的事情:

jcb.engineMove(move.toString());

如果toString()只应该用于调试(如mre所说),你可以实现另一个名为getText方法来执行相同的操作。

重要的提示:

不应该在其toString方法中创建新的Move对象。

这是一个非常糟糕的主意(正如其他人所提到的)。

你的toString方法应该只是构建一个字符串并返回它。

是在Move类中实现的toString() ? 如果是,那么我看到的是无限循环。 而且……我真的不明白你为什么要创建一个Move类的新实例。

无论如何,要在Move类中生成字符串表示,请尝试使用以下内容:

 public class Move { @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append(rank).append(file); builder.append(newRank).append(newFile); return builder.toString(); } } 

然后,如果你想获得你正在做的字符串表示( jcb.engineMove(move.toString()); )并不是一个糟糕的方法。

Object#toString的使用应限于调试。

我希望这不是Move类中toString()方法的代码。 我担心的原因是你在其中创建Move对象并通过s+="" + move;递归调用toString()方法s+="" + move; (这与s+=move.toString() )相同。

  1. 覆盖toString()方法是实现对象的自定义文本表示的常用和正确方法。 您将在整个文献和文档中找到此程序。

  2. 在Java中(就像C#等其他语言一样), toString()方法在对象类型中定义,这意味着Java中的每个对象都有这种方法。 如果您的自定义对象(inheritance自类object )覆盖了toString()方法,那么您的基类提供了此方法的新实现,该方法隐藏/省略了超类中的toString()方法。

这意味着当您在自定义类A中定义自定义toString()方法时,调用该类型的实例(比如说它是a) a.toString()将导致调用您的实现。

  1. 在这种情况下,我可能不会使用toString(),因为它似乎只是重复Move类中的逻辑。 为了添加任何其他细节,我有一个问题:你在哪个类中添加这个toString()方法?

  2. 您可以像调用任何其他方法一样调用此方法。 首先,您需要一个对象实例来调用它:

    someObj.toString();

为了提供更多细节,我需要回答上一个问题。

如上所述,你不应该使用toString()来代替你的代码所依赖的function。 现在,你想要完成什么? 你能提供这些课程的代码吗? 我认为你的engineMove方法应该采用Move对象,而不是String。 如果您能提供更多细节,我们可能会引导您朝着更好的方向前进。

另外,请注意您拥有的代码。 为什么需要创建一个占用toString()内部时间和资源的新Move对象? toString()应该在类的实例上运行,所以你不需要创建一个新的,但更多的是,使用s + =“”+ move; 将隐式调用新Move对象上的toString(),它将在新的Move对象上再次调用它…