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