如何检查子对象是否来自特定类(而不是父类)(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));