Java 如何将子类强制转换为超类[无法转换]?

Java 如何将子类强制转换为超类[无法转换]?,java,inheritance,casting,subclass,superclass,Java,Inheritance,Casting,Subclass,Superclass,我有一个叫做英雄的普通类和三个扩展它的子类:法师、战士、游侠。英雄类有生命值和力量值,每个子类都有附加属性 public class Warrior extends Hero { private int armor; public Warrior(int health, int strength, int armor) { super(health,strength); this.armor = armor; } } public class Hero { private

我有一个叫做英雄的普通类和三个扩展它的子类:法师、战士、游侠。英雄类有生命值和力量值,每个子类都有附加属性

public class Warrior extends Hero {
private int armor;

public Warrior(int health, int strength, int armor) {
    super(health,strength);
    this.armor = armor;
}

}


public class Hero {
private int health;
private int strength;

public Hero(int health, int strength) {
    this.health = health;
    this.strength = strength;

}

//Getters
public int getHealth() {
    return health;
}
public int strength() {
    return strength;
}
//Setters
public void takeDamage(Hero player, int n) {
    player.health = player.health-n;
}
public void healDamage(Hero player, int n) {
    player.health = player.health+n;
}
}

在主类中,我尝试创建两个英雄对象,当用户选择他们想要成为的类时,我想创建英雄类并将其转换为英雄,这样它也将具有英雄属性和方法

public static void main(String[] args) {

    Hero hero1 = new Hero(100,10);
    Hero hero2 = new Hero(100,10);
    //Players select the class
    Scanner scanner = new Scanner(System.in);
    System.out.println("Player select a class: Warrior, Mage, Ranger ");
    String p = scanner.next();
    switch (p) {
    case "Warrior": Warrior h1 = (Hero)hero1; //this doesn't work
        break;
    case "Mage":
        break;
    case "Ranger":
        break;
    }




}
我环顾四周,在一个例子中,我有点理解一个对象如何是整数,你可以做“inti=(integer)object;”。所以我很困惑,为什么我的英雄战士不能被铸造成英雄对象。

这里:

Hero hero1=新英雄(100,10)

你是说
hero1
Hero

在这里:

Warrior h1=(英雄)hero1

你想说hero1是一个战士,但它不是。这是一个英雄

以下是关键:所有
Warrior
实例都是
Hero
实例,但并非所有
Hero
实例都是
Warrior

为了将
hero1
投射到
战士
,必须将其创建为
战士
。e、 g


英雄英雄1=新战士(100,10)

我相信你下面说的是一种误解:

。。。我想创建那个英雄类,并将它作为英雄来施展,这样它就有了 英雄属性和方法

public static void main(String[] args) {

    Hero hero1 = new Hero(100,10);
    Hero hero2 = new Hero(100,10);
    //Players select the class
    Scanner scanner = new Scanner(System.in);
    System.out.println("Player select a class: Warrior, Mage, Ranger ");
    String p = scanner.next();
    switch (p) {
    case "Warrior": Warrior h1 = (Hero)hero1; //this doesn't work
        break;
    case "Mage":
        break;
    case "Ranger":
        break;
    }




}
子类始终具有其超类的属性。所以在这种情况下,如果
Warrior
Hero
的一个子类,那么
Warrior
将拥有
Hero
拥有的所有属性和方法,因此您实际上不需要“将子类强制转换为超类”。从来没有这样的需要

在这个特定的例子中,您可能想要写的是

Hero hero1 = new Hero(100 /* health */,10 /* strength */);
. . .
case "Warrior": 
    Hero h1 = hero1; 
    break;
还是这个

Hero warrior1 = new Warrior(100 /* health */
                            ,10 /* strength */
                            ,20 /* armor */);
. . .
case "Warrior": 
    Hero h1 = warrior1 ; 
    break;
甚至这个

Warrior warrior1 = new Warrior(100 /* health */
                               ,10 /* strength */
                               ,20 /* armor */);
. . .
case "Warrior": 
    Hero h1 = warrior1 ; 
    break;

哪一个更合适?这取决于您的具体情况(即,您真的希望对象是
英雄
还是
战士

战士
应该扩展
在这里
放置这个类的代码:
法师
战士
游侠
“我的英雄战士不能投射到英雄对象”你没有战士,你有一个任意的英雄实例,你不能也不应该尝试进行向下投射。如果你不是战士,那么就创建一个,而不是创建一个英雄的实例并施放它。对不起,我刚刚意识到我复制了两次英雄类而不是显示战士类。现在修复了“哪一个更合适?”它们都没有,因为它们都使用范围相当有限的局部变量。