如何检查子对象是否来自特定类(而不是父类)(Java)
我必须为学校写一个基于文本的小游戏,其中我有一个玩家课和一个电脑课。在游戏类中,我需要区分这两个类,以便仅当玩家不是计算机时才能打印指令如何检查子对象是否来自特定类(而不是父类)(Java),java,class,object,Java,Class,Object,我必须为学校写一个基于文本的小游戏,其中我有一个玩家课和一个电脑课。在游戏类中,我需要区分这两个类,以便仅当玩家不是计算机时才能打印指令 public class Player { private String name; public Player(String name) { this.name = name; } } public class Computer extends Player { public Computer(String
public class Player {
private String name;
public Player(String name) {
this.name = name;
}
}
public class Computer extends Player {
public Computer(String name) {
super(name);
}
}
我尝试了以下方法:
player1 = new Player;
if(player1.getClass() != Computer.class) {
System.out.println("Your turn, player 1.");
}
这应该打印“轮到你了,玩家1”。因为玩家不是电脑,对吗?其实不然,我也不知道该怎么做
我尝试过instanceof,但它总是返回true,因为计算机是Player的实例
非常感谢您的帮助
~Daan这闻起来像是坏设计的征兆。您通常不必检查a类值的类型。在这种情况下,您可以在Player类中使用一个布尔值来指定Player是否为人类 如果你真的想采用这种设计,你需要的是“instanceof”操作符。在谷歌上搜索“java instanceof”以获取更多信息
编辑:我现在知道你已经尝试了instanceof。为什么要将instanceof与Player类进行比较?是否要将instanceof与计算机类进行比较?您可以使用instanceof:
if(!(player1 instanceof Computer))
……但这是个糟糕的设计。由于计算机是一个玩家(继承),它们应该具有相同的能力(API)。一个非常简单的想法是让它们都使用printGreeting()方法实现IPlayer接口:
您可以创建一个方法,该方法返回player类中播放器的指令。然后,每个子类都可以重写getInstructions方法,以提供更具体的指令。对于计算机,这将是一个空字符串。你可以这样做:
public class Player {
private String name;
public Player(String name) {
this.name = name;
}
public String getInstructions() {
return "Instructions";
}
}
public class Computer extends Player {
public Computer(String name) {
super(name);
}
@Override
public String getInstructions() {
return "";
}
}
然后,如果指令不是空的,您可以直接打印它们
Player p = new Player("asdf");
Player c = new Computer("qwer");
String instruction = p.getInstruction();
if (!instruction.empty()) {
System.out.printLine(instruction);
}
instruction = c.getInstruction();
if (!instruction.empty()) {
System.out.printLine(instruction);
}
当然,您可以将输出流传递给getInstruction方法,并将其直接写入输出流。那么你就不需要ifs了。计算机总是玩家的一个实例,但玩家并不总是计算机。请尝试以下方法:
if(!player.instanceof(Computer)){…}
但请记住,如果您将player1初始化为一个新的播放器,它将永远不会是计算机的实例。因此,如果要将播放器初始化为计算机,则需要使用计算机的构造函数。
以下代码将返回“true”:
你能发布你在做实例时尝试过的东西吗?如果它不打印,那么你还有其他问题。检查对象的
getClass()
的条件不可能对Player
实例计算为false
。@Magnilex-他不能使Player抽象化。他需要它的实例..OP:我已经尝试了instanceof,但它总是返回true,因为计算机是玩家的实例。
警告:更有经验的读者仍然会对上述答案感到畏缩。我试图避免一个更大的讨论,即如何将一个模型耦合到控制台作为一种通信手段,以及如何通过printGreeting(Player)等方法真正实现某种功能(ConsoleMessagePrinter?)它会打印一个特定于播放器类型的问候语…我试过instanceof,但出于某种原因,它会说播放器是计算机的一个实例。不过我会使用播放器消息。谢谢大家!!或者甚至将Player变成一个抽象类,以防某些功能对人和计算机都有相同的实现。
Player p = new Player("asdf");
Player c = new Computer("qwer");
String instruction = p.getInstruction();
if (!instruction.empty()) {
System.out.printLine(instruction);
}
instruction = c.getInstruction();
if (!instruction.empty()) {
System.out.printLine(instruction);
}
Player player1 = new Computer();
System.out.println(player1.instanceof(Computer));