如何在Java中更改对象类型

时间:2018-07-25 21:06:46

标签: java class object

我正在尝试将一个对象更改为另一个类似的对象。 这两个对象都是Player类的子类,它最初是Human类型的,而我试图将其更改为EasyCompAI类型,而仍然是Human类型。当我初始化p2时,它是Player p2 = new Human();没关系我尝试过:

    private RoomUpdateCallback mRoomUpdateCallback = new RoomUpdateCallback() {
    @Override
    public void onRoomCreated(int code, @Nullable Room room) {
        // Update UI and internal state based on room updates.

        if(room != null)
            Log.d("SignInGoogleOnlineFrag", "Room isn't null");

        if(code == GamesCallbackStatusCodes.OK)
            Log.d("SignInGoogleOnlineFrag", "OK");

        if (code == GamesCallbackStatusCodes.OK && room != null) {
            Log.d("SignInGoogleOnlineFrag", "Room " + room.getRoomId() + " created.");
        } else {
            Log.w("SignInGoogleOnlineFrag", "Error creating room: " + code);
            // let screen go to sleep
            getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        }
    }

但是当我这样做

Player p2=new Human(2,'2');
p2 = null; 
p2 = new EasyCompAI(2, '2');

我得到人类

感谢您的宝贵时间,如果需要更多背景信息,我们将不胜感激。

2 个答案:

答案 0 :(得分:2)

您确定要更新boardPanel的p2属性吗?因为在进行Player p2 = new Human(2, '2,')操作时,您正在创建一个新变量。您需要将其保存在boardsPanel对象中。

答案 1 :(得分:0)

变量和实例

首先,可能您是在混淆变量和对象实例。

如果您创建变量(或属性),则该变量可能包含对该变量的相同类或其任何子类的对象的引用。

// this variable may contain instances of Player or any Player subclass
Player player;

您可以为变量分配子类之一的对象实例。例如,您可以为上述玩家变量分配一个Person实例。然后,当您打印对象的类时,Java将显示正确的类型。

player = new Human( 2, "2");
System.out.println(player.getClass());

// The output is "class example.Human"

您可以将其他对象分配给变量。分配其他对象后,如果再次打印该对象的类,则Java将始终显示正确的类型。

player = new AIPlayer( 2, "2");
System.out.println(player.getClass());

// The output is "class example.AIPlayer"

在Java中,您不能更改对象的类(类型)。这是不可能的。您可以将不同类的对象分配给同一变量。自然地,您只能分配变量的相同类或其任何子类的对象。


在您的程序中...

您的程序可能有错误。

请注意,您的示例代码中可能在BoardPanel类的构造函数或任何其他方法中都提到了一个变量

Player p2=new Human(2,'2');

// this is unnecessary
// p2 = null; 

p2 = new EasyCompAI(2, '2');

稍后,您正在尝试获取属性(而不是变量)的值

gui.getBoardPanel().getP2().getClass();

请记住,变量和属性不相同。例如,在以下类中,该类中的p2属性和方法中的p2变量是不同的。

class Example {

   Player p2;   // attribute

   public void example() {
      Player p2;    // variable
   }

}