所有子类的主类实例

时间:2017-03-30 16:07:12

标签: java inheritance polymorphism

我有三个课程:BankaccountCoin。我希望类Bank有一个默认的硬币变量,我将其传递给它的构造函数。所以我将帐户扩展到Bank,这意味着我可以通过方法getmainCoin()通过account类访问默认的硬币变量。出于某种原因,我在尝试时遇到了这个错误:

  

错误:(12,32)java:com.company.bank类中的构造函数bank不能应用于给定的类型;     必需:com.company.Coin     发现:没有争论     原因:实际和正式的参数列表长度不同

// Instantiations 
Coin dollars = new Coin("Dollar", "$");;
bank SomeBank = new bank(dollars);
Person john = new Person("John Doe", 20, dollars, new account(9058));
System.out.println(john.checkbalance());

public class bank {
  public String name;
  private int coinsheld;
  private Coin maincoin;

  public bank(Coin maincoin){
      this.maincoin = maincoin;
  }

  public Coin getmainCoin(){
      return this.maincoin;
  }

}

public class account extends bank {
  private int balance;
  private static int accounts;
  private int accnumber;
  private Coin coin;

  public account(int balance){
      this.balance = balance;
      this.accounts += 1;
      this.accnumber = accounts;
      this.coin = getmainCoin();
  }
}

public class Coin {
  public static int total;
  private String name;
  private String sign;
  private int id;

  public Coin(String name, String sign){
      this.name = name;
      this.sign = sign;
      this.id = total + 1;
  }

  public int getID(){
      return this.id;
  }
}

4 个答案:

答案 0 :(得分:1)

问题是当你在“帐户”对象中使用getCoin()时,该给定对象中没有硬币集,让我们一步一步地查看它:

  • 有一个班级
  • 帐户类扩展了bank(但是DOESNT设置了coin属性/变量,因为你没有使用setCoint()方法在构造函数中设置它)
  • 您使用getMainCoin() - >硬币值从未设置 - >错误:“com.company.Coin found”。

所以你可以采取这种方法:

  1. 如果要将默认硬币设置为所有Bank对象,可以执行一个类变量(也称为静态变量),更改“private Coin maincoin;”到“私人静态硬币maincoin”。如果你采用这种方法,你应该创建一个静态方法“setCoin()”或使你的构造函数静态。

    这样,如果扩展该类,并且一旦将Coin对象设置为Bank类,该类的每个对象(或者例如扩展它的对象)将具有相同的Coin对象。

    < / LI>
  2. 但是如果你想让每个Bank对象拥有不同的默认Coin(甚至是你创建的新Account对象),那么你应该在你的Account构造函数中添加一个参数来设置硬币或setCoint()方法而不是在你甚至设置if之前调用getCoin()。

  3. 编辑:因为错别字和视觉吸引力。

答案 1 :(得分:0)

在您的帐户类中,您必须调用bank构造函数,因为account扩展了bank并且没有默认(无参数)构造函数。 做这样的事情:

super(coin)

答案 2 :(得分:0)

你的account类构造函数public account(int balance)隐式调用父类默认构造函数super();,但是你没有提供任何默认构造函数bank上课。

因此,您可以通过在bank类中创建默认构造函数来解决此问题,如下所示:

public class bank {

    public bank() {
    }

   //your code here
}

然而,您的班级关系不正确,即,当您在java中说Account extends Bank时,这意味着Account IS-A Bank,它不会似乎是对的。

此外,您不遵循类,方法,变量名称的Java命名约定,即类/接口名称以大写字母开头,其中方法/变量名称应为小写。

答案 3 :(得分:0)

每当扩展一个类时,子类会在其构造函数中自动调用super()super()基本上称为超级&#39;构造函数。现在,您的超类 bank没有无参数构造函数,因为您覆盖了默认 。要修复,请添加如下构造函数: -

public bank() {

}

或者您可以使用super对象明确调用Coin

public account(int balance){
  super(someCoinReference);
  ..//rest of code
}

然而,这可能不是你想要的。