我如何知道对象实例使用什么类型的变量?

How do I know what type of variable to use for an instance of an object?

package RPG;
import java.util.Random;
import java.util.Scanner;

public class Beginnings
{
    public static boid main (String[] args)
    {
        Scanner scan = new Scanner(System.in);
        System.out.println("Pick a class:");
        System.out.println("Fighter: Deals more damage");
        System.out.println("Mage: Has more health");
        System.out.println("Theif: Deals less damage but has         more health");
        String Class = scan.nextLine();
        if (Class.matches(".*Fighter.*"));
            Fighter user = new Fighter();
        else if (Class.matches(".*Mage.*"));
            Mage user = new Mage();
        else if (Class.matches(".*Thief.*"));
            Thief user = new Thief();
        else
            Human user = new Human();
        user.Name();
        user.Explore();

/*当我 运行 代码时,它突出显示第一个 "user" 并显示 "variable declaration not allowed here" 我不知道如何解决这个问题。 */

假设'user'是一名拥有'class'的玩家(即战士/法师)。我会制作一个单独的播放器 class 并存储该信息。

class Player {

  String classType; // where you would store the player's class information

  int hitPoints;

}

变量的类型必须是您可能分配给它的所有对象的公共基础 class。由于 class Object 是所有其他 class 的基础 class,您可以这样做:

Object user = new Fighter();

但这可能不是一个好主意。

您可能应该从基数 class 导出 FighterMage 等,比如说 Character。除了基础 class,您还可以使用接口。

您有一些拼写错误可能会导致问题

public static boid main (String[] args)

应该是

public static void main (String[] args)

System.out.println("Theif: Deals less damage but has         more health");

应该是

System.out.println("Thief: Deals less damage but has         more health");

此外,大写 Class() 和小写 class 也已经包含在 Java SDK 中。您应该使用不同的变量名。我在下面的示例中使用了 characterStr。标准做法规定您应该使用驼峰式命名变量,使用大写字母命名 Java classes。人们在实例化Class()对象时,一般会实例化为Class clazz = new Class()

展望未来,我认为您应该为不同的用户 类 创建一个超级 class。设置如下:

public abstract class Character
public class Fighter extends Character
public class Thief extends Character
public class Mage extends Character
public class Human extends Character

这样,您 main() 中的代码就可以使用您的 Character() 对象

public static void main(String[] args)
{
    // Prompt the user for the character they want
    Scanner scan = new Scanner(System.in);
    System.out.println("Pick a class:");
    System.out.println("Fighter: Deals more damage");
    System.out.println("Mage: Has more health");
    System.out.println("Theif: Deals less damage but has         more health");

    // Get the user's response
    String characterStr = scan.nextLine();

    Character user; // You might have to initialize this. Did not test
    if (characterStr.matches(".*Fighter.*"))
    {
        user = new Fighter();
    }
    else if (characterStr.matches(".*Mage.*"));
    { 
        user = new Mage();
    }        
    else if (characterStr.matches(".*Thief.*"));
    {
        user = new Thief();
    }
    else
    {
        user = new Human();
    }

    user.Name();
    user.Explore();

} 

第一个问题:如果不将声明放在括号之间,则不能在 if 语句的 then 中声明变量。编译器不接受它。

第二个问题:如果你想在最后调用实例化实例上的方法,你应该在 if-else-if 之前声明一个变量:

user.Name();
user.Explore();


在每个 if 中,您应该实例化合适的子用户 class 并将其分配给上面声明的 user 变量。

在Java中,方法应该以小写开头。我修改了它。 该代码假定 User 是父 class,并且您在条件语句中实例化的 class 是 User 的子 class。 User 应该定义一个 name() 方法和一个 explore() 方法。

    User user = null;
    if (Class.matches(".*Fighter.*")){
         user = new Fighter();
    }
    else if (Class.matches(".*Mage.*")){
         user = new Mage();
    }
    else if (Class.matches(".*Thief.*")){
         user = new Thief();
    }
    else{
         user = new Human();
    }
    user.name();
    user.explore();