【问题标题】:What's making the object field automatically change?是什么使对象字段自动更改?
【发布时间】:2020-02-05 17:14:11
【问题描述】:

我正在制作一个简单的播放器/会话系统,但我发现了一个逻辑错误,即使在我看来一切正常。

让我描述一下我的想法,我还在学习 OOP 的工作原理,这就是我在这个项目中练习的原因:

  • 首先我创建了两个类:
    1. 类玩家
    1. 班级会议

在 Session 的类中,我有一个名为 joinSession(Session s); 的方法。 这个方法会让玩家的对象像这样加入会话:

Session s1 = new Session();
Player p1 = new Player(name : "Jack");

p1.joinSession(s1);

问题是在 Session 属性中我有一个:

public Player firstPlayerToJoin;
public Player lastPlayerToJoin;

每当我让玩家加入会话时,一切似乎都很好,Jack 是 firstPlayerToJoin 和 lastPlayerToJoin。但真正的问题是当其他玩家决定加入时:

Player p2 = new Player("Rose");    
p2.joinSession(s1);

Rose 将再次成为 firstPlayerToJoin 和 lastPlayerToJoin,而不仅仅是 lastPlayerToJoin。

这是我的代码:

第一个玩家类



    private static int id;

    private Session session;

    boolean isOnSession = false;

    public static String name;

    public static void say(String message){
        System.out.println(name + " says " + message);
    }

    // Player join session

    public void joinSession(Session s){
        this.session = s;
        System.out.println(name + " joined the session : " + this.session.sessionName );

        System.out.println("Players ONLINE = " + s.playersOnline);
        if( s.playersOnline == 0){
            s.firstPlayerToJoin = this;
            s.lastPlayerToJoin = this;
        }  else {

        s.lastPlayerToJoin = this;}
        s.playersOnline++;
    }


    public void quitSession(){
        this.session = null;
        isOnSession = false;
        System.out.println(name + " left his session.");
    }

    Player(String name){
        id = id++;
        this.name = name;

    }

    public static void showPlayerInfo(Player n){
        System.out.println("========== Player INFO ==========");
        System.out.println("ID : " + id + "\nName : " + name );
    }
}

这里是 Session 类:


public class Session {

    int id = 0;

    int maxConnected = 10;

    public int playersOnline = 0;

    String[] playersConnected = new String[maxConnected];

    public String sessionName;
    public Player firstPlayerToJoin;
    public Player lastPlayerToJoin;

    Session(){
        this.id=id++;

this.sessionName = "SESSION"+id;
    }

    public void sessionInfo(){
        System.out.println("======== Session INFO ========");
        System.out.println("Session name : " + sessionName);
        System.out.println("Players online : " + playersOnline);
        System.out.println("First player to join : " + firstPlayerToJoin.name);
        System.out.println("Last player to join : " + lastPlayerToJoin.name);
        System.out.println("==============================");
    }

    int getPlayersOnline(){
        return this.playersOnline;
    }
}

最后是主类和方法:


public class Main {

    public static void main(String[] args) {


Player p1 = new Player("Omar");

Session s1 = new Session();

p1.joinSession(s1);

s1.sessionInfo();


Player p2 = new Player("Rick");

p2.joinSession(s1);

s1.sessionInfo();




    }



}

如果对这个想法有任何疑问或困惑,请告诉我。

实际输出:

Omar joined the session : SESSION0
Players ONLINE = 0
======== Session INFO ========
Session name : SESSION0
Players online : 1
First player to join : Omar
Last player to join : Omar
==============================
Rick joined the session : SESSION0
Players ONLINE = 1
======== Session INFO ========
Session name : SESSION0
Players online : 2
First player to join : Rick
Last player to join : Rick
==============================

在最后一行之前的行中,我们可以看到:第一个加入的玩家:Rick 玩家的对象 p1 会覆盖该属性,即使条件不成立。

【问题讨论】:

  • name 字段为 static。删除static
  • 如果您有调试器,您可以启动调试会话并尝试一下;)。通过调试可以学到很多东西。

标签: java oop logic


【解决方案1】:

我将详细说明 RealSkeptic 的评论(直到他说出来我才明白)。

您的姓名字段是静态的。目前,如果你写(p1 == p2),你会得到false,因为它们确实是不同的对象。通过将其设为静态变量,您可以为整个类设置它(静态变量称为 class 变量)。您打算做的是本地化您的变量,以便您的各个玩家拥有自己的名字。

因此:

public static String name;

应该是:

public String name;

您的 IDE 可能会告诉您,您现在正在以不正确的方式访问名称。访问静态变量或方法时,您可以通过类本身而不是该类的对象来访问它们。

例如

Player.NAME

而不是

Player p1 = new Player("tom");
p1.NAME;

因为如前所述,它们是针对类本身的,而不是针对所述类的本地对象实例化的。如果您愿意,Here 可以进一步阅读:

【讨论】:

  • 非常感谢您的帮助!你为我节省了很多时间。再次感谢您。当我在静态和恒定之间混淆时,我真的很挣扎。我想让这个名字无法更改。
猜你喜欢
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 2011-08-08
  • 2019-03-17
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多