Java:如何在另一个类的一个类中使用实例化的对象?

时间:2014-06-09 12:36:12

标签: java class object

我一直在尝试为高中的编程课程创建一个游戏,我遇到了一个与在不同类中实例化的对象有关的问题。我的老师一直无法帮助,因为他和我们一起学习"。

public void launchGame(){
    ObjectInitialize init = new ObjectInitialize();
    init.objectInitialize();
    while(year > 1900){
        util.checkEvents();
        prussia.setTactics(4);

我在另一个调用此方法的类中有一个main方法。此方法的第一件事是创建名为ObjectInitialize的类init的新对象。然后我在objectInitialize上调用init方法。这是该方法的代码:

public void objectInitialize(){
    Country france = new Country("France", 10, 200, 2, 100, 100, 1, 1, 800);
    Country russia = new Country("Russia", 8, 150, 1, 100, 100, 1, 1, 1300);
    Country austria = new Country("Austria", 8, 150, 1, 100, 100, 1, 1, 700);
    Country prussia = new Country("Prussia", 8, 175, 2, 100, 100, 1, 1, 700);
    FranceUI franceUI = new FranceUI();
    RussiaUI russiaUI = new RussiaUI();
    AustriaUI austriaUI = new AustriaUI();
    PrussiaUI prussiaUI = new PrussiaUI();
    EventHandlerUI eventHandlerUI = new EventHandlerUI();
    GameStartUI gameStartUI = new GameStartUI();
    AllianceUI allianceUI = new AllianceUI();
    Utilities util = new Utilities();
}

如您所见,此方法会创建许多对象。这种方法没有明显的错误。但是,当我尝试使用util.checkEvents()prussia.setTactics(4)对象/方法时,我的IDE告诉我它找不到符号"。这是因为launchGame()方法所在的类无法访问在另一个类中创建的对象吗?如果是这样,我该如何解决这个问题?如果有人需要看,我可以发布更多我的代码。谢谢!

修改

我已将最初在objectInitialize()方法中的所有代码移动到构造函数中,并为外部的每个对象创建了变量,如下所示:

public class objectInitialize {
    Country france;
    Country russia;
    Country austria;
    Country prussia;
    FranceUI franceUI;
    RussiaUI russiaUI;
    AustriaUI austriaUI;
    PrussiaUI prussiaUI;
    EventHandlerUI eventHandlerUI;
    GameStartUI gameStartUI;
    AllianceUI allianceUI;
    Utilities util;

    public objectInitialize(){
        Country france = new Country("France", 10, 200, 2, 100, 100, 1, 1, 800);
        System.out.println("france done");
        Country russia = new Country("Russia", 8, 150, 1, 100, 100, 1, 1, 1300);
        System.out.println("russia done");
        Country austria = new Country("Austria", 8, 150, 1, 100, 100, 1, 1, 700);
        System.out.println("austria done");
        Country prussia = new Country("Prussia", 8, 175, 2, 100, 100, 1, 1, 700);
        System.out.println("prussia done");
        FranceUI franceUI = new FranceUI();
        RussiaUI russiaUI = new RussiaUI();
        AustriaUI austriaUI = new AustriaUI();
        PrussiaUI prussiaUI = new PrussiaUI();
        EventHandlerUI eventHandlerUI = new EventHandlerUI();
        GameStartUI gameStartUI = new GameStartUI();
        AllianceUI allianceUI = new AllianceUI();
        System.out.println("ui done");
    }
    public Country getFrance(){
        return france;
    }
}

我也创建了返回对象的方法,就像你建议的那样。但是,我仍然遇到问题:

public class Game {
    int year = 1836;
    int currentTurn = 0;

    public void launchGame(){
        System.out.println("123");
        objectInitialize init = new objectInitialize();
        System.out.println("123");
        System.out.println(init.france.equip); // <-- Right here is the problem. My IDE
    }                                          // is telling me that I have a 
}                                              // NullPointerException at this line

即使我将init.france.equip更改为init.getFrance().equip,我也会遇到同样的错误。有任何想法吗?以下是Country类的代码:

public class Country {
String name;
int income;
int treasury;
int industry;
int influence;
int prestige;
int tactics;
int equip;
int manpower;

public Country(String startName, int startIncome, int startTreasury, int startIndustry, int startInfluence, int startPrestige, int startTactics, int startEquip, int startManpower){
    name = startName;
    income = startIncome;
    treasury = startTreasury;
    industry = startIndustry;
    influence = startInfluence;
    prestige = startPrestige;
    tactics = startTactics;
    equip = startEquip;
    manpower = startManpower;
}
public int getEquip(){
    return equip;
}

当我将.equip更改为.getEquip时,我仍然会收到相同的错误。

我认为引用指的是什么?但是,不应该创建init对象允许我引用国家/地区对象吗?希望这不是一个糟糕的问题,我非常感谢你的所有建议和帮助。

6 个答案:

答案 0 :(得分:1)

你需要在某处保存那些初始化的对象。

现在,你的ObjectInitialize()函数会创建一堆对象,然后在方法结束时超出范围。

如果在ObjectInitialize类中将每个对象声明为类变量,则可以按照显示的方式引用它们

public class ObjectInitialize{

    public Country france, russia, austria, prussia;
    .
    .
    .
    public void objectInitialize(){
        france = new Country("France", 10, 200, 2, 100, 100, 1, 1, 800);
        russia = new Country("Russia", 8, 150, 1, 100, 100, 1, 1, 1300);
        austria = new Country("Austria", 8, 150, 1, 100, 100, 1, 1, 700);
        prussia = new Country("Prussia", 8, 175, 2, 100, 100, 1, 1, 700);
        .
        .
        .
        }
    }

此外,重新阅读后,我发现您可以通过将该方法作为构造函数来进一步跳过一步。只需将public void ObjectInitialize更改为public ObjectInitialize() 这样,您可以通过调用ObjectInitialize int = new ObjectInitialize()来设置所有内容,而无需调用init.ObjectInitialize()

最后,当您想要访问其中的每个国家/地区时,请务必引用它们,例如init.prussia.setTactics()

答案 1 :(得分:1)

McMill! 实际发生的是你正在创建一个对象并且永远不会返回对它的引用。您最好尝试将国家定义为普通班级的一部分。类似的东西:

    public class ObjectInitialize(){
Country france,russia,austria,prussia;
...

public void objectInitialize(){
    france = new Country("France", 10, 200, 2, 100, 100, 1, 1, 800);
    russia = new Country("Russia", 8, 150, 1, 100, 100, 1, 1, 1300);
    austria = new Country("Austria", 8, 150, 1, 100, 100, 1, 1, 700);
    prussia = new Country("Prussia", 8, 175, 2, 100, 100, 1, 1, 700);
    FranceUI franceUI = new FranceUI();
    RussiaUI russiaUI = new RussiaUI();
    AustriaUI austriaUI = new AustriaUI();
    PrussiaUI prussiaUI = new PrussiaUI();
    EventHandlerUI eventHandlerUI = new EventHandlerUI();
    GameStartUI gameStartUI = new GameStartUI();
    AllianceUI allianceUI = new AllianceUI();
    Utilities util = new Utilities();
}
...
}

希望这有帮助!

然后为每个变量添加以下getter:

public Country getPrussia(){
 return prussia;
}

并为其他国家重复一遍......

答案 2 :(得分:1)

像这样改变你的课程。在函数外声明变量。并将其公之于众。

public class objectInitialize{
Country france ;
    Country russia ;
    Country austria ;
    Country prussia ;
    FranceUI franceUI ;
    RussiaUI russiaUI ;
    AustriaUI austriaUI ;
    PrussiaUI prussiaUI ;
    EventHandlerUI eventHandlerUI ;
    GameStartUI gameStartUI ;
    AllianceUI allianceUI ;
    Utilities util ;

public void objectInitialize(){
    france = new Country("France", 10, 200, 2, 100, 100, 1, 1, 800);
    russia = new Country("Russia", 8, 150, 1, 100, 100, 1, 1, 1300);
    austria = new Country("Austria", 8, 150, 1, 100, 100, 1, 1, 700);
    prussia = new Country("Prussia", 8, 175, 2, 100, 100, 1, 1, 700);
    franceUI = new FranceUI();
    russiaUI = new RussiaUI();
    austriaUI = new AustriaUI();
    prussiaUI = new PrussiaUI();
    eventHandlerUI = new EventHandlerUI();
    gameStartUI = new GameStartUI();
    allianceUI = new AllianceUI();
    util = new Utilities();
}


}

在这里初始化函数内部的变量,更好地使用构造函数而不是

ObjectInitialize init = new ObjectInitialize();
    init.objectInitialize();

更改为       public ObjectInitialize(){         //函数的内容被移动到这个类。     }

现在创建一个对象ObjectInitialize init = new ObjectInitialize();,它将初始化变量。

你可以像这样调用里面的值。 Object.variableName

  init.russia 

这将为您提供俄罗斯的价值,同样可以使用您想要的任何对象。

答案 3 :(得分:0)

您需要在ObjectInitialize类中添加一个getter方法。

所以,

public PrussiaUI getPrussiaUi() { return prussiaUi; }

此外,在构造函数中创建的对象是方法范围。因此,在施工后,他们有资格进行垃圾收集。它们需要移动到类级变量。

构造函数之外需要读取,

private PrussiaUI prussiaUi;

ObjectInitialize()
{
    prussiaUi = new PrussiaUi(....)
    ....
}

答案 4 :(得分:0)

您可以为在ObjectInitialize类中创建的每个对象设置getter方法,并使用这些getter方法获取所需的对象。

作为一个例子:

public Country getFrance(){
     return france;
}

对于每个对象,你可以进入任何其他java类,如:

ObjectInitialize obji = new ObjectInitialize();
Country france = obji.getFrance();

答案 5 :(得分:0)

问题在于,您将france声明为实例变量,并将其声明为类objectInitialize的构造函数中的局部变量。所以实际上它们是两个不同的变量。 代表国家的其他变量也会出现同样的问题。

然后,如果您在构造函数中初始化局部变量 france,那么您将null声明为实例变量。< / p>

您应该将代码更改为:

public class objectInitialize {
    Country france;
    Country russia;
   ...

    public objectInitialize(){
        //Country france = new Country("France", 10, 200, 2, 100, 100, 1, 1, 800); <-- WRONG
        france = new Country("France", 10, 200, 2, 100, 100, 1, 1, 800); // <-- CORRECT
        System.out.println("france done");
        russia = new Country("Russia", 8, 150, 1, 100, 100, 1, 1, 1300);
        System.out.println("russia done");
        ...
    }
    public Country getFrance(){
        return france;
    }
}

另外,尝试为您的类使用有意义的名称,objectInitialize是一个非常糟糕的选择,因为它没有说明此类及其实例的作用是什么。 例如,您可以将其重命名为GameUI,但这取决于您。 无论您的名字选择是什么,请尝试尊重该语言的惯例。例如,类名应以大写字母开头。