2015-05-05 37 views
-1

我正在嘗試爲我正在開發的遊戲實現保存/加載功能。基本上,我有一個執行所有渲染和更新遊戲狀態對象的主類(遊戲狀態對象包含玩家,敵人以及它們各自的位置,速度等)。所以我想我只是將遊戲狀態對象保存到文件usingObjectOutputStream並加載ObjectInputStream。保存/加載似乎工作正常,直到我在播放器類中的字符串字段上執行if語句爲止。我儘可能重新編寫代碼以重現奇怪的行爲。使用ObjectInputStream後的奇怪行爲

Player類:

import java.io.Serializable; 

public class Player implements Serializable 
{ 
    /** 
    * 
    */ 
    private static final long serialVersionUID = -5933597609049497854L; 
    private String type; 

    public Player() 
    { 
     type = "evil"; 
    } 

    public String getType() 
    { 
     return type; 
    } 


    public void setType(String type) 
    { 
     this.type = type; 
    } 
} 

主類:

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 

public class Main 
{ 
    private Player player; 

    public Main() 
    { 
     player = new Player(); 

     System.out.println("player.getType(): "); 
     System.out.println(player.getType()); 
     System.out.println("player.getType() == evil: "); 
     System.out.println(player.getType() == "evil"); 

     saveGame(); 

     loadGame(); 

     System.out.println("player.getType(): "); 
     System.out.println(player.getType()); 
     System.out.println("player.getType() == evil: "); 
     System.out.println(player.getType() == "evil"); 
    } 

    public static void main(String[] Args) 
    { 
     new Main(); 
    } 

    private void saveGame() 
    { 
     try 
     { 
      FileOutputStream out = new FileOutputStream("save"); 

      ObjectOutputStream objectOut = new ObjectOutputStream(out); 

      objectOut.writeObject(player); 

      objectOut.close(); 

     } catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    private void loadGame() 
    { 
     try 
     { 

      FileInputStream fin = new FileInputStream("save"); 

      ObjectInputStream objectIn = new ObjectInputStream(fin); 

      player = null; 

      player = (Player) objectIn.readObject(); 

      objectIn.close(); 

     } catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

我收到從程序的輸出如下:

player.getType():
邪惡
player.getType()== evil:
true
player.getType():
邪惡
player.getType()==邪惡:

爲什麼領域type不被視爲 「惡」?

+1

'player.getType()==「evil」'比較String對象時使用equals方法。 – copeg

+1

'=='不能用於比較字符串(或一般的對象) - 至少不會與您期望的輸出相同。改用'equals'。除此之外,要求進行一些研究之前, – Paul

回答

0

因爲Object平等與.equals測試。如果您使用==您正在測試引用相等性,並且兩個等效值的實例可能(並且與序列化一起)具有不同的引用。你需要類似

player.getType().equals("evil")