Java 如何检查对象是否已创建?

Java 如何检查对象是否已创建?,java,instantiation,Java,Instantiation,问题 我有一个Army类,它运行两次(由一个单独的驱动程序类)来创建两个Army。在该Army类中,有以下语句用于从我拥有的其他类文件创建新对象: public final Archer archer = new Archer(this); public final Catapult catapult = new Catapult(this); public final NCatapult ncatapult = new NCatapult(this); //Ninja catapu

问题

我有一个Army类,它运行两次(由一个单独的驱动程序类)来创建两个Army。在该Army类中,有以下语句用于从我拥有的其他类文件创建新对象:

  public final Archer archer = new Archer(this);
  public final Catapult catapult = new Catapult(this);
  public final NCatapult ncatapult = new NCatapult(this); //Ninja catapult
  public final Ninja ninja = new Ninja(this);
  public final Horse horse = new Horse(this);
  public final Samurai samurai = new Samurai(this);
每个对象的构造函数在其构造函数方法参数中都需要一个“Army”对象,因此在实例化中使用了
this
关键字

所以。在Horse类中的一个方法中,我创建了一个新的“Warrior”对象,因为Warrior最初不是在Army类中实例化的

private boolean warriorCreated = false;
  public void dismount(){
    if (!warriorCreated){
      Warrior warrior = new Warrior(myArmy);
      warriorCreated = true;
      myArmy.getOurArmyWindow().getTabbedPane().addTab("(Ethan)", new ImageIcon("images/warriorIcon.jpg"), warrior.genGetPanel()); //This is just adding the Warrior's tab to my GUI. It's not relevant to the problem.
    }
    ...//Some stuff to handle when the method is called and warriorCreated is true
    }//end dismount()
您将注意到它如何在战士的构造函数中使用变量“myArmy”。这只是马实例化时传递的Army对象

public Horse(Army armyInstance){ //A constructor that takes in whatever Army object called it
    myArmy = armyInstance;
  }
在所有不同的实例化对象中,我可以使用
myArmy.getEnemyArmyInstance()
方法访问其他敌对军队。我不想详细解释它是如何工作的,并且占用了比我更多的空间,所以请相信我它是工作的

这意味着通常我可以通过调用类似于
Ninja-enemyNinja=myArmy.getEnemyArmyInstance().Ninja的东西来引用对方军队实例化的对象(我可以用我想引用的任何其他对象替换“忍者”)

但是,由于Warrior对象是由一个Horse类方法实例化的,而不是从每个Army对象的get go开始,因此我首先要检查它是否已经实例化,然后再尝试从一个单独的对象引用它

这就是我遇到麻烦的地方。每当我试图检查Warrior对象是否已经实例化时,它都会在编译时给我一个错误

例如,考虑这个检查:

public void checkForWarrior(){
if (myArmy.getEnemyArmyInstance().warrior != null){
  System.out.println("A warrior exists!");
}
else
  System.out.println("There is no warrior!");
}
它抛出了错误

error: cannot find symbol   
if (myArmy.getEnemyArmyInstance().warrior != null){
                                 ^
symbol:   variable warrior
location: class Army
我尝试过的

我认为创建的战士对象可能不是陆军的成员(这是正确的术语,对吗?),所以我尝试在行中添加“.horse”,但得到了类似的结果

   if (myArmy.getEnemyArmyInstance().horse.warrior != null){
                                          ^
   symbol:   variable warrior
   location: variable horse of type Horse
我甚至尝试添加一个布尔值,当一个战士被实例化时,它会在Horse类中打开,然后首先检查它。但是没有骰子

private boolean mounted = true; //This is in the Horse class and is set to
false when a Warrior is instantiated.
在其他类别中:

if (myArmy.getEnemyArmyInstance().horse.getMounted()){
Warrior enemy = myArmy.getEnemyArmyInstance().warrior;//Still gives me an
//error that it cannot find the variable warrior. (I tried adding .horse to
//this, too).
问题


从不是马实例化它的对象,我如何检查战士对象是否已经实例化,以便我可以从其他对象引用它?

如果我正确理解您的问题,您需要将以下内容添加到
陆军
类:

public Warrior warrior;
  public void dismount(){
    if (myArmy.warrior == null){
      myArmy.warrior = new Warrior(myArmy);
      myArmy.getOurArmyWindow().getTabbedPane().addTab("(Ethan)", new ImageIcon("images/warriorIcon.jpg"), warrior.genGetPanel()); //This is just adding the Warrior's tab to my GUI. It's not relevant to the problem.
    }
    ...//Some stuff to handle when the method is called and warriorCreated is true
    }//end dismount()
然后在你的
课程中:

public Warrior warrior;
  public void dismount(){
    if (myArmy.warrior == null){
      myArmy.warrior = new Warrior(myArmy);
      myArmy.getOurArmyWindow().getTabbedPane().addTab("(Ethan)", new ImageIcon("images/warriorIcon.jpg"), warrior.genGetPanel()); //This is just adding the Warrior's tab to my GUI. It's not relevant to the problem.
    }
    ...//Some stuff to handle when the method is called and warriorCreated is true
    }//end dismount()

我希望这能有所帮助。

如果您想让我澄清一些事情或添加更多信息,请在立即投票之前让我先澄清。我试着尽可能全面地阐述这一点,这样人们就不会感到困惑或愤怒:)啊,我明白了。这是解决我问题的可行办法。这是否意味着如果Warrior对象在Horse类中被/完全/实例化(在Army类中没有给它一个变量名),就无法从其他类引用它?