【问题标题】:Instantiating an object within another object in Java (Composition vs inheritance)在 Java 中的另一个对象中实例化一个对象(组合与继承)
【发布时间】:2020-05-04 00:11:17
【问题描述】:

我试图了解 Java 中的组合是如何工作的,但我遇到了困难。我有一个程序实例化一个客户对象,该对象具有一个计算机对象作为实例变量。 我的程序中有两种类型的计算机对象,桌面和笔记本子类,所以我的桌面类扩展了计算机,我的笔记本电脑类也扩展了计算机。我有我的计算机类作为一个抽象类,但我知道你不能实例化一个抽象对象。我不确定如何在我的 Customer 类中实例化 Computer 对象。任何见解表示赞赏! 示例代码:

public class Customer
{
   private String name;
   private Computer computer;

   public Customer(String n)
   {
      setName(n);
      this.computer = new Computer(); //Can't do this b/c Computer is abstract
   }

   //Setters and getters for name
   public Computer getComputer()
   {
      return new Computer(this.computer);
   }

   public void setComputer(Computer computer)
   {
      this.computer = new Computer(computer);
   }

}
public abstract class Computer{
}

public class Desktop extends Computer{
}

public class Laptop extends Computer{

}

【问题讨论】:

  • 您也没有采用 Computer 实例的 Computer 构造函数。所以,this.computer = new Computer(computer);return new Computer(this.computer); 也无效。
  • 正如您自己所说,您不能实例化抽象类,但您可以使用this.computer = new Desktop();this.computer = new Laptop();。这将起作用,因为它们都扩展了计算机,并且可以在任何需要计算机的地方使用。
  • 哦,我没有意识到你可以像这样简单地实例化子类!谢谢,这真的很有帮助!

标签: java


【解决方案1】:

是的,你是对的。您不能实例化抽象类 Computer()。 相反,您可以这样做

this.computer = new Laptop() 
this.computer = new Desktop()

取决于他们拥有的。

【讨论】:

    【解决方案2】:

    你解决这个问题的方法是你的构造函数也应该接受一个计算机参数

       public Customer(String n, Computer c)
       {
          setName(n);
          this.computer = c;
       }
    

    但是有很多理由更喜欢只有一个空构造函数的 POJO(普通旧 Java 对象),而不是需要在构造类型中组合元素的类。更多信息请见:What's the advantage of POJO?

    【讨论】:

      猜你喜欢
      • 2018-12-13
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      相关资源
      最近更新 更多