Java 在toString中使用equals或instanceof

Java 在toString中使用equals或instanceof,java,clone,equals,tostring,instanceof,Java,Clone,Equals,Tostring,Instanceof,好的,伙计们,我有一个带有“MartianManager”类的程序:*注意代码不完整,还有一些缺失的部分,只是提供了完整的代码,以供参考,说明完成后的外观 import java.util.ArrayList; public class MartianManager { private ArrayList<Martian> martians; private ArrayList<Martian> teleporters; public void addMartian(

好的,伙计们,我有一个带有“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) {    
}
}
它扩展为“绿色火星人”:

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);
}

}
还扩展了RedMartian:

public class RedMartian extends Martian {

public RedMartian(int id) {
    super(id);
}
public void speak() {
    System.out.println(id + "Rubldy Rock");
}
}
实际上我有几个问题,但现在我的问题是关于火星人的。它应该返回这样的字符串:“红色[或绿色]火星人”+id。我需要确定火星人的类型,我开始使用instanceof,但像这样“火星人无法解析为变量”。我试图确定这是最好的方法还是equals()是确定类型的最好方法

这也是我第一次使用“克隆”,所以不确定它到底是如何工作的,但我想知道有没有办法确定“克隆”是什么,并以这种方式确定它

谢谢你的帮助

public String toString(){
    String str;
    if (Martian instanceof GreenMartian) {  
}
abstract
Martian
课程中是个坏主意。您不希望父类依赖于其子类

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


如果你一定要

if (Martian instanceof GreenMartian) {  
这是错误的。您可以同样使用
instanceof

instanceOfClass instanceof SomeClass
在本例中,您将使用
this
关键字获得对
instanceOfClass
的引用,因为您正在实例上调用该方法

this instanceof GreenMartian
没有

abstract
Martian
课程中是个坏主意。您不希望父类依赖于其子类

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


如果你一定要

if (Martian instanceof GreenMartian) {  
这是错误的。您可以同样使用
instanceof

instanceOfClass instanceof SomeClass
在本例中,您将使用
this
关键字获得对
instanceOfClass
的引用,因为您正在实例上调用该方法

this instanceof GreenMartian

您可以使用
String name=this.getClass().getSimpleName()
获取类的名称。然后您可以检查
name.substring(0,1).equals(“G”)
name.substring(0,1”).equals(“R”)
来检测红色或绿色。

您可以使用
String name=this.getClass().getSimpleName()
来获取类的名称。然后你可以检查
name.substring(0,1).equals(“G”)
name.substring(0,1”).equals(“R”)
来检测红色或绿色。

FWIW,如果(这是绿色火星人的实例),应该是
-但是,无论何时你试图使用这种向下投射(向上投射??),这都是糟糕的OO设计的标志。而是为火星人编写一个专门的
toString()
方法。你应该在你的
equals()
方法中检查
o==null

FWIW,如果(这是绿色火星人的实例)
,应该是
,但我认为,无论何时你试图使用这种向下投射(向上投射),这都是糟糕的OO设计的标志。而是为火星人编写一个专门的
toString()
方法。你应该在
equals()
方法中检查
o==null

火星人不是一个变量。请尝试以下方法:

如果(绿色火星人的实例)


火星人不是一个变量。请尝试以下方法:

如果(绿色火星人的实例)


您确实不应该让父类引用任何扩展它的类。这是一种糟糕的做法(实际上可能不起作用,我还没有测试过)。实际上,您应该在每个扩展类中重写toString函数

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);
    }

    @Override
    public String toString() {
         return "GreenMartian: whatever info you'd like to include.";
    }

}
现在,如果您想为所有子类使用类似的格式,您有两个选项。一种是调用父类的toString方法,并将其前置到子类的toString方法

@Override
public String toString() {
    return super.toString() + "GreenMartin: info.....";
}

//The parent toString could look like this:
@Override
public String toString(){
    return "Martian( ... put any parent class info here, id ect)";
}
绿色火星toString调用的最终输出可能如下所示:

Martian(id:23) GreenMartian(planet:greenburg)
第三种选择是在父类中使用公共字符串格式。例如,在父类中,包括以下属性:

protected static final String format = "Class: %s, id: %s, info: %s";
然后,在子类toString中,可以执行以下操作:

@Override
public String toString() {
    return String.format(format,this.getClass().toString(),id,myInfo);
}

您确实不应该让父类引用任何扩展它的类。这是一种糟糕的做法(实际上可能不起作用,我还没有测试过)。实际上,您应该在每个扩展类中重写toString函数

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);
    }

    @Override
    public String toString() {
         return "GreenMartian: whatever info you'd like to include.";
    }

}
现在,如果您想为所有子类使用类似的格式,您有两个选项。一种是调用父类的toString方法,并将其前置到子类的toString方法

@Override
public String toString() {
    return super.toString() + "GreenMartin: info.....";
}

//The parent toString could look like this:
@Override
public String toString(){
    return "Martian( ... put any parent class info here, id ect)";
}
绿色火星toString调用的最终输出可能如下所示:

Martian(id:23) GreenMartian(planet:greenburg)
第三种选择是在父类中使用公共字符串格式。例如,在父类中,包括以下属性:

protected static final String format = "Class: %s, id: %s, info: %s";
然后,在子类toString中,可以执行以下操作:

@Override
public String toString() {
    return String.format(format,this.getClass().toString(),id,myInfo);
}

这是非常糟糕的OO设计。这是非常糟糕的OO设计,效率低下。为什么要创建子字符串并对其调用
equals
,以便只比较单个
字符
?为什么不
name.charAt(0)==“G”
?太明显了?这是非常糟糕的OO设计。这是非常糟糕的OO设计,效率低下。为什么要创建子字符串并对其调用
equals
,以便只比较单个
字符
?为什么不
name.charAt(0)==“G”
?太明显了?好吧,这很有意义,我已经用instanceof更新了我的代码。这就是它应该看起来的样子,还是可以再简化一下?@user2745043不,不。检查维基百科中的多态性,你会发现it@user2745043它在语法上是正确的(假设您的导入是正确的),但这是一个非常糟糕的想法。这就是它应该看起来的样子,还是可以再简化一下?@user2745043不,不。检查维基百科中的多态性,你会发现it@user2745043它在语法上是正确的(假设您的导入是正确的),但这是一个非常糟糕的主意。尽管您是对的,但请不要这样做。请参阅Sotirios'/aglassman的答案并使用多态性.totaly