Java 在toString中使用equals或instanceof
好的,伙计们,我有一个带有“MartianManager”类的程序:*注意代码不完整,还有一些缺失的部分,只是提供了完整的代码,以供参考,说明完成后的外观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(
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