Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';是什么使对象字段自动更改?_Java_Oop_Logic - Fatal编程技术网

Java 什么';是什么使对象字段自动更改?

Java 什么';是什么使对象字段自动更改?,java,oop,logic,Java,Oop,Logic,我正在制作一个简单的播放器/会话系统,但我只是发现了一个逻辑错误,即使在我看来一切正常 让我描述一下我的想法,我还在学习OOP是如何工作的,这就是为什么我要在这个项目中实践: 首先,我创建了两个类: 职业选手 课堂 在会话的类中,我有一个名为joinSession(会话s)的方法; 此方法将使玩家的对象加入会话,如下所示: Session s1 = new Session(); Player p1 = new Player(name : "Jack"); p1.joinSessio

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

让我描述一下我的想法,我还在学习OOP是如何工作的,这就是为什么我要在这个项目中实践:

  • 首先,我创建了两个类:
  • 职业选手
  • 课堂
在会话的类中,我有一个名为joinSession(会话s)的方法; 此方法将使玩家的对象加入会话,如下所示:

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

p1.joinSession(s1);
问题在于,在会话属性中,我有一个:

public Player firstPlayerToJoin;
public Player 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 );
    }
}

这是课时课:


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
==============================
在最后一个玩家之前的队伍中,我们可以看到:第一个加入的玩家:瑞克
玩家的对象p1会覆盖属性,即使存在不正确的条件。

我将详细说明Real怀疑论者的评论(直到他说出来我才弄清楚)

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

因此:

public static String name;
应该是:

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

e、 g

而不是

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

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

名称
字段是
静态
。删除
静态
。如果您有调试器,可以启动调试会话并试用;)。通过调试您可以学到很多东西。非常感谢您的帮助!你为我节省了很多时间。再次感谢你。我真的很挣扎,因为我混淆了静态和常量。我想让这个名字不可能改变。
Player p1 = new Player("tom");
p1.NAME;