Java 根据大小写初始化具有相同名称的变量

Java 根据大小写初始化具有相同名称的变量,java,class,variables,types,initialization,Java,Class,Variables,Types,Initialization,所以我有一节课: public class x { ConsoleIO io = new ConsoleIO(); private Board board; private boolean playing; public x (String een, String twee) { this.board = new Board(); if (een.toUpperCase().equals("C")) { Computer speler1 = new Compu

所以我有一节课:

public class x {
ConsoleIO io = new ConsoleIO();

private Board board;
private boolean playing;

public x (String een, String twee) {
    this.board = new Board();
    if (een.toUpperCase().equals("C")) {
        Computer speler1 = new Computer(een);
    } else {
        Player speler1 = new Player(een);
    }
    if (twee.toUpperCase().equals("C")) {
        this.speler2 = new Computer(twee);
    } else {
        this.speler2 = new Player(twee);
    }
    this.playing = true;
}
}
如您所见,我想根据我给出的输入初始化变量speler1和speler2。 显然这不起作用。我知道我应该像这样预先初始化变量:

public class x {
ConsoleIO io = new ConsoleIO();

private Board board;
private boolean playing;
private Player speler1;
private Player speler2;
但我只限于那种类型的球员,我不想这样。有没有办法做到这一点?
*注意:计算机是播放器的扩展。

我的建议是声明一个
对象

private Object speler1;
然后在您的if条件中:

speler1 = new Computer(een);

现在,当您需要使用speler1时,只需使用如下检查

// if(speler1 instanceof Computer)
if(speler1 instanceof Player)
    player1 = (Player)speler1;

我的答案建立在Sabuj的基础上:

我会尝试让计算机和播放器实现一个公共接口,定义它们共享的方法。然后可以使用该接口而不是
对象
。否则,如果您不打算调用相同的方法,我认为没有必要以相同的方式命名一个变量:

public interface Participant {
    public void makeMove();
}
public class Player implements Participant {...}
public class Computer implements Participant {...}
这样就可以实现以下功能:

Participant p;
if (...) {
    p = new Player();
} else {
    p = new Computer();
}
...
p.makeMove();

您可能可以通过这种方式避免某些强制转换。

问题可能在于:

 if (een.toUpperCase().equals("C")) {
        Computer speler1 = new Computer(een);//delete here 'Computer'
    } else {
        Player speler1 = new Player(een);//delete here 'Player'
    }
如果
Computer
扩展了
Player
,为什么不先将
speler1
声明为
Player
,然后根据具体情况对其进行初始化

Player speler1;
...
...
...    

 if (een.toUpperCase().equals("C")) {
            speler1 = new Computer(een);
        } else {
            speler1 = new Player(een);
        }

是不是应该是这样的:

public class X {
    final ConsoleIO io = new ConsoleIO();

    private final Board board;
    private final Player player1;
    private final Player player2;
    private boolean playing;

    public X(String een, String twee) {
        this.board = new Board();

        if (een.toUpperCase().equals("C")) {
            this.player1 = new Computer();
        } else {
            this.player1 = new Human(een);
        }

        if (twee.toUpperCase().equals("C")) {
            this.player2 = new Computer();
        } else {
            this.player2 = new Human(twee);
        }

        this.playing = true;
    }
}
注:

Human
Computer
都是
Player
的子类。将常用方法/字段移动到
Player
基类中。如果你做得对,以后可能不必区分
计算机
人类


例如,在
Player
基类中可能有一个抽象方法
move
,该方法在子类中单独实现:
Computer#move
使用算法计算下一步的移动<代码>人类#移动要求人类玩家输入下一步移动。因此,如果轮到
player1
,您只需调用
player1.move()
,而不管它是
人类还是
计算机
,听起来都很有趣。你能给我举个例子吗?我编辑了我的答案(可能是在你键入评论时),这个例子解释了我的意思吗?如果没有,请告诉我哪些部分不清楚。但我需要对象播放器和计算机中的所有方法。这是否意味着我必须复制所有这些方法。(我不熟悉“接口”)接口只是告诉实现接口的任何类上有哪些方法可用(这是一个相当普遍的OOP概念)。这就是为什么在上面的示例中没有makeMove()方法的实现。播放器和计算机可能(而且很可能会)有不同的这种方法的实现。我试过了,但是变量仍然被识别为播放器类型。我不明白你的意思。当然,它们是玩家对象。计算机扩展播放器,人类扩展播放器。不,如果我以后在一个方法中创建一个临时变量:Computer speler=this.speler1;“无法从播放机转换到计算机”。为什么要这样做?如果您认为/设计是面向对象的,则不需要这样做。见上面我的笔记。在极少数情况下,您仍然可以通过instanceof来确定它是计算机还是人。这是行不通的。计算机是播放器的一个子类,所以speler1将始终是播放器的实例,即使它是一台计算机。它会工作。例如(
Player扩展计算机
),对象将同时与
Player
Computer
匹配,这是真的。您必须先检查
Player
,然后检查'Computer'。因为如果我以后在一个方法中创建一个temp变量:Computer speler=this.speler1;“无法从播放器转换到计算机”。如果计算机扩展了播放器,则表示计算机的所有字段也在播放器中。如果您声明一个播放器(比计算机更通用),您将能够使用播放器实例(显然)设置该播放器实例,但也可以使用计算机设置该播放器实例(因为所有计算机字段都在播放器中)。也许你可以试着做一个演员阵容,比如计算机speler=(计算机)this.speler1;
public class X {
    final ConsoleIO io = new ConsoleIO();

    private final Board board;
    private final Player player1;
    private final Player player2;
    private boolean playing;

    public X(String een, String twee) {
        this.board = new Board();

        if (een.toUpperCase().equals("C")) {
            this.player1 = new Computer();
        } else {
            this.player1 = new Human(een);
        }

        if (twee.toUpperCase().equals("C")) {
            this.player2 = new Computer();
        } else {
            this.player2 = new Human(twee);
        }

        this.playing = true;
    }
}