Java 访问公共对象变量

Java 访问公共对象变量,java,oop,singleton,public,Java,Oop,Singleton,Public,我正在编写一个Tic-Tac-Toe程序,我试图在驱动程序中使用这个类中的方法playOn,我不确定应该如何使用我已经定义的公共变量X和O来使用这个方法。它的设计应该是单体的。感谢您的帮助 public class TTTPlayer { public TTTPlayer X = new TTTPlayer('X'); public TTTPlayer O = new TTTPlayer('O'); private char symbol; private Ran

我正在编写一个Tic-Tac-Toe程序,我试图在驱动程序中使用这个类中的方法playOn,我不确定应该如何使用我已经定义的公共变量X和O来使用这个方法。它的设计应该是单体的。感谢您的帮助

public class TTTPlayer {
    public TTTPlayer X = new TTTPlayer('X');
    public TTTPlayer O = new TTTPlayer('O');
    private char symbol;
    private Random gen;
    private boolean playerTurn; // true for 'X', false for 'O'

    private TTTPlayer(char ch) {
        this.symbol = ch;
    }
    public void playOn(TTTBoard board) {
        int row = gen.nextInt(2);
        int col = gen.nextInt(2);
    if (playerTurn) {
        board.place(X, row, col);
        playerTurn = false;
    } else {
        board.place(O, row, col);
        playerTurn = true;
   }
}

我认为这里缺少的是静态修饰符

静态成员属于类,它们生活在一种全局存在中,尽管它们不一定是全局可访问的。您可以通过对类的引用来访问它们,比如out是类系统的静态成员,因此System.out

使用new创建新对象时,它是唯一的实例,并且包含实例成员。out实际上是PrintStream的一个对象实例,所以当您说out.println时,println是一个实例方法

其他一些语言允许您在某种全局名称空间中声明函数和内容,但Java没有,所有内容都必须放在一个类中。所以我们有静态成员

这里,X和O是静态成员,如System.out,但它们也是封闭类的实例

public class TTTPlayer {
    private char symbol;

    private TTTPlayer(char ch) {
        this.symbol = ch;
    }

    public static TTTPlayer X = new TTTPlayer('X');
    public static TTTPlayer O = new TTTPlayer('O');
    private static Random gen;
    private static boolean playerTurn; // true for 'X', false for 'O'

    public static void playOn(TTTBoard board) {
        int row = gen.nextInt(2);
        int col = gen.nextInt(2);
        if (playerTurn) {
            board.place(X, row, col);
            playerTurn = false;
        } else {
            board.place(O, row, col);
            playerTurn = true;
        }
    }
}
要播放转弯,请调用TTTPlayer.playOn。类似地,使用类的名称(如TTTPlayer.X和TTTPlayer.O)访问X和O


如果你不喜欢实例和静态之间的区别,有些人没有考虑,把这两个区别分成不同的类。一个是用于代币的,另一个是用于移动的静态成员。

首先,我同意@Radiodef的观点,X和O应该是静态的。这将解决一些访问问题

另外,在我看来,有两个变量的作用是相同的:

private char symbol;
它包含一个X或O来表示玩家

private boolean playerTurn;
注释明确指出,这也表示X或O

我认为symbol变量更有用,因为它包含转弯时要使用的确切字母。如果使用此变量,可以通过记住将有两个TTTPlayer对象,每个对象存储各自的符号值,从而大大简化playOn方法


最后,你还需要检查一个玩家是否试图在一个已经被占据的方格中移动。

要有一个单打。您可以将构造函数设置为私有,并在私有静态字段中使用它:

private static MySingleton = new MySingleton();
然后提供一个访问器getMySingleton


如果可以的话,还可以将玩家设置为私人而不是公开

我会假设你和board是完全一样的;和board.placeO,row,col;。为什么X和O是公共的呢?好吧,为了确保没有其他TTTPlayer实例被创建,我的老师指定构造函数为私有的,并创建两个实例X和O为公共的,我不明白为什么,因为这让我更难使用它的方法。我不能在我的驱动程序中声明TTTPlayer实例,因为它是私有的,但我可以将它声明为如下变量:TTTPlayer player;但是我不能用任何方法…嗯。。。如果它们是公开的,那么我敢猜测它们将在定义它们的类之外使用。我同意X和O应该是静态的。使playOn成为静态似乎有问题。@代码大师是的,它可以被重构,我想你的意思是每个玩家都有自己的动作,但我真的不想推荐太多。它没有被破坏,所以在我的书中它很好。啊,谢谢你,我认为它与静态修改器有关,但正如你所说的,我对它的区别有点模糊。驱动程序的实际结构非常严格,所以,只要其他一切正常,我很高兴。我在我的答案中添加了一个静态/实例的示例——我希望这能有所帮助。我的评论太长了,不管怎么说,在回答中还是比较好的。。我确实看到了冗余。我尝试用this.symbol=='X'替换布尔值,但eclipse说它在静态上下文中不起作用。