我正在尝试将一个对象更改为另一个类似的对象。 这两个对象都是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');
我得到人类
感谢您的宝贵时间,如果需要更多背景信息,我们将不胜感激。
答案 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
}
}