[英]Why is “instanceof” not working?
我正在使用Java 实例,但它似乎没有工作。
我有三个扩展Hero类的java类。
Hero.java类:
public abstract class Hero {
protected int health;
public Hero() {
}
}
其他三个类:
public class Archer extends Hero {
public Archer() {
}
}
public class Mage extends Hero {
public Mage() {
}
}
public class Warrior extends Hero {
public Warrior() {
}
}
我有这个主类WelcomeScreen.java
public class WelcomeScreen {
private Archer archer;
private Mage mage;
private Warrior warrior;
private Hero hero;
public WelcomeScreen() {
// choose a hero (archer/mage/warrior)
hero = archer;
new Game(hero);
}
public static void main(String args[]) {
new WelcomeScreen();
}
}
实例化Game.java类
public class Game {
public Game(Hero chosenHero) {
if (chosenHero instanceof Mage) {
System.out.println("you selected mage");
} else if (chosenHero instanceof Archer) {
System.out.println("you selected archer");
} else if (chosenHero instanceof Warrior) {
System.out.println("you selected warrior");
} else {
System.out.println("you selected NOTHING");
}
}
}
在Game.java中 ,代码用于检查selectedHero是否是Archer.java , Warrior.java或Mage.java的对象,但我的结果是“你选择了NOTHING” 。 为什么instanceof无法检查我是否已将其分配给WelcomeScreen中的Archer.java ?
因为你的常量是null
。 当你说,
private Archer archer;
它相当于
private Archer archer = null;
此外,您已为每个实例创建了三个字段。 我想你想做点什么
private static final Hero archer = new Archer();
private static final Hero mage = new Mage();
private static final Hero warrior = new Warrior();
另请参阅“编程到接口”是什么意思?
替代解决方案:摆脱instanceof,因为它暗示了一种易碎的刚性设计。 而是尝试使用其他更符合OOP的解决方案,例如继承,或者复杂的访问者设计模式。
例如,一个简单的继承结构可能类似于:
public class WelcomeScreen {
public WelcomeScreen() {
// choose a hero (archer/mage/warrior)
Hero hero = new Archer();
new Game(hero);
}
public static void main(String args[]) {
new WelcomeScreen();
}
}
abstract class Hero {
protected int health;
// other shared fields such as String name,...
public Hero() {
}
public abstract String getType();
public int getHealth() {
return health;
}
}
class Archer extends Hero {
public static final String TYPE = "Archer";
public Archer() {
}
@Override
public String getType() {
return TYPE;
}
}
class Mage extends Hero {
public static final String TYPE = "Mage";
public Mage() {
}
@Override
public String getType() {
return TYPE;
}
}
class Warrior extends Hero {
public static final String TYPE = "Warrier";
public Warrior() {
}
@Override
public String getType() {
return TYPE;
}
}
class Game {
private Hero hero;
public Game(Hero chosenHero) {
this.hero = chosenHero;
System.out.println("You selected a hero of type " + hero.getType());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.