【问题标题】:Creating two objects of a class in another class in Java在Java中的另一个类中创建一个类的两个对象
【发布时间】:2013-11-11 21:08:20
【问题描述】:

我正在尝试在 SiloManager 类中创建 Silo 类的两个对象,以便我可以访问这两个对象的方法。但我似乎无法使SiloManager 构造函数工作,也无法正确实例化这些类。 (我是java的初学者)。这是我的代码:

public class GrainSiloManager {

    public GrainSilo silo1 = new GrainSilo(100);
    public GrainSilo silo2 = new GrainSilo(50);


    public GrainSiloManager(GrainSilo silo1, GrainSilo silo2) {
        this.silo1 = silo1;
        this.silo2 = silo2;
    }

    private void showStatus() {
        System.out.println("The current grain in silo1 is: " + silo1.getGrain());
        System.out.println("The current grain in silo2 is: " + silo2.getGrain());
    }

}

正如我所说,我是一个初学者,所以放轻松,呵呵,谢谢你的帮助。

【问题讨论】:

  • 看起来不错,但您想要哪些对象?您将 silo1 和 silo2 实例化为类变量,但不要使用它们,因为您从构造函数中获取参数。此外,如果 GrainSilo 不工作,我们需要查看该类的代码。
  • 您需要包含 GrainSilo 的代码。
  • 您将silo1silo2 初始化为新的GainSilo 实例,然后在构造函数中重新定义它们。哪一个是你真正想要使用的?

标签: java class constructor


【解决方案1】:
public GrainSilo silo1 = new GrainSilo(100);
public GrainSilo silo2 = new GrainSilo(50);


public GrainSiloManager(GrainSilo silo1, GrainSilo silo2) {
    this.silo1 = silo1;
    this.silo2 = silo2;
}

这将被编译为:

public GrainSilo silo1;
public GrainSilo silo2;


public GrainSiloManager(GrainSilo silo1, GrainSilo silo2) {
    this.silo1 = new GrainSilo(100);
    this.silo2 = new GrainSilo(50);
    this.silo1 = silo1;
    this.silo2 = silo2;
}

如您所见,这几乎没有意义。您正在使用传递给构造函数的对象覆盖您创建的对象。

【讨论】:

  • 对发帖人的解释非常好。我从来没有真正想过实例化这样的实例变量等同于首先在构造函数中实例化它们。现实中是这样编译的吗?
  • @John docs.oracle.com/javase/tutorial/java/javaOO/initial.html "Java 编译器将初始化程序块复制到每个构造函数中。"。最重要的是,字段初始值设定项总是发生在构造函数之前。如果这种行为没有很好地定义,那么你会在这里得到不同的筒仓对象,具体取决于编译器
【解决方案2】:

您的构造函数将替换“public!” silo1 和 silo2 对象以及传入的任何内容。您可以像这样更改构造函数

 public GrainSiloManager() {
    super();
 }

甚至更短(但等效)

 public GrainSiloManager() {
 }

然后这样称呼它

 new GrainSiloManager().showStatus();

或者您可以使用您现有的方法(这将替换您构造函数中的 GrainSoloManager.silo1 和 GrainSoloManager.silo2)

 GrainSilo silo1 = new GrainSilo(100);
 GrainSilo silo2 = new GrainSilo(50);
 new GrainSiloManager(silo1, silo2).showStatus();

【讨论】:

  • 需要注意的是,没有理由在上面定义的类的 ctor 中调用 super。
  • @Dave-Newton 需要注意的是,没有理由明确地调用 super ,因为 Java 无论如何都会为我们做这件事(如果我们省略它)!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
相关资源
最近更新 更多