在toString中使用equals或instanceof

use*_*043 0 java clone equals instanceof tostring

好吧,我有一个带有'MartianManager'类的程序:*注意代码不完整仍然有一些缺失的部分只是提供了整个代码,以供参考完成后它将如何完成

import java.util.ArrayList;

public class MartianManager {
private ArrayList<Martian> martians;
private ArrayList<Martian> teleporters;

public void addMartian(Martian m) {
    martians.add(m);
    if(m instanceof GreenMartian)
        teleporters.add(m);
}
//public Object clone() {

public Martian getMartianClosestToID(int id) {  
}
public void groupSpeak() {
    for(Martian m : martians) {
        m.speak();
    }
}
public void groupTeleport(String dest) {    
}
}
Run Code Online (Sandbox Code Playgroud)

和火星类:

public abstract class Martian implements Cloneable {
int id;

public Martian(int id) {
    this.id = id;
}
public Object clone() throws CloneNotSupportedException {
    return super.clone();
}
public int getId() {
    return id;
}
public boolean equals(Object o){
    return this.getId() == ((Martian)o).getId();    
}
public abstract void speak();

public String toString(){
    String str = "";
    if (this instanceof GreenMartian) {
        str = "Green martian" + id;
    }
    if (this instanceof RedMartian) {
        str = "Red martian" + id;
    }
    return str;
}       
}
Run Code Online (Sandbox Code Playgroud)

它与GreenMartian一起扩展:

public class GreenMartian extends Martian implements ITeleport{

public GreenMartian(int id) {
    super(id);
}
public void speak() {
    System.out.println(id + "Grobldy Grock");
}
public void teleport(String dest) {
    System.out.println(id + "teleporting to " + dest);
}

}
Run Code Online (Sandbox Code Playgroud)

还通过RedMartian进行了扩展:

public class RedMartian extends Martian {

public RedMartian(int id) {
    super(id);
}
public void speak() {
    System.out.println(id + "Rubldy Rock");
}
}
Run Code Online (Sandbox Code Playgroud)

我实际上有几个问题,但现在我的问题是火星类的toString.它应该返回一个这样的字符串:"Red [或Green] martian"+ id.我需要确定火星人的类型,我开始使用instanceof但是像这样"火星人无法解析为变量".我试图确定这是否是最好的方法,或者如果equals()是确定类型的最佳方法?

这也是我第一次使用"克隆"所以不确定它是如何工作的,但有一种想法是否有办法确定"克隆"是什么并确定它是这样的?

感谢您的帮助!

Sot*_*lis 5

没有

public String toString(){
    String str;
    if (Martian instanceof GreenMartian) {  
}
Run Code Online (Sandbox Code Playgroud)

abstract Martian课堂上是一个坏主意.您不希望父类依赖其子级.

toString()在每个子类中实现一个方法,让多态实现它的工作.


如果你绝对必须

if (Martian instanceof GreenMartian) {  
Run Code Online (Sandbox Code Playgroud)

是错的.您可以使用instanceof为使

instanceOfClass instanceof SomeClass
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您将获得instanceOfClassthis关键字的引用,因为您在实例上调用该方法

this instanceof GreenMartian
Run Code Online (Sandbox Code Playgroud)