2014-01-15 34 views
1

所以,我目前通过错误的工作测试一些我的代码,我似乎得到这个错误:儿童的构造似乎调用父类的构造没有我的电话

constructor Being in class Being cannot be applied to given types; 
public class Monster extends Being{ 
^
required: String,String 
    found: no arguments 
    reason: actual and formal argument lists differ in length 

这里是我的代码示例: (家长)

public abstract class Being{ 
public String name; 
public Race race; 
public int str = 10, agi = 10, con = 10, wis = 10, HP, MP, tHP, tMP, lvl; 

//Object Creator 

public Being(String n, String rce){ 
    name = n; 
    tHP = (con/2) + 10; 
    tMP = (wis/2) + 10; 
    HP = tHP; 
    MP = tMP; 
    lvl = 1; 
    } 
} 

(儿童)

public class Monster extends Being{ 

private Monster m = new Monster(); 
} 

这只是一个小例子。我已经尝试了许多不同的方法来在Monster.java中创建构造函数,但每次出现相同的错误。有人请帮忙!

+0

这就是java的是如何工作的,关于构造函数/多态性 – vandale

+0

这就是我害怕......什么办法,我也许能得到解决吗? – tanishalfelven

+0

当实例化一个子类时,java将首先实例化它的所有基类,并将默认实例化它们,其签名类似于你的子类。在你的代码中,你的基类没有默认的构造函数,所以java不能这样做。 – Rugal

回答

1

首先,编译器假定无参数构造函数。也就是说,关于Java构造函数要记住的主要事情是,一旦定义了非参数构造函数以外的构造函数,任何子类都必须调用它。

因此,由于您的父类定义了一个带有两个字符串的构造函数,因此您的子类必须调用它。您的选项是:

  1. 创建在子类
  2. 创建在子类中其他一些构造两个字符串构造函数,但必须在父调用这两个字符串的构造函数,
  3. 创建无父类中的构造函数。

(可能有更奇特的选择,但这些都是前三名,我觉得)

在代码:

1:

public class Monster extends Being { 
    . . . 
    public Monster(String n, String rce) { 
    super(n, rce); 
    } 
    . . . 
} 

2:

public class Monster extends Being { 
    . . . 
    public Monster() { 
    super("Default n", "Default rce"); 
    // or 
    // super(null, null); 
    // or 
    // super("Default n", null); 
    // etc 
    } 
    . . . 
} 

3:

public abstract class Being { 
    . . . 
    public Being() { 
    . . . 
    } 
    public Being(String n, String rce) { 
    . . . 
    } 
    . . . 
} 
. . . 
public class Monster extends Being { 
. . . 
    public Monster() { 
    super(); 
    } 
. . . 
} 

问题是,一旦声明了构造函数,子类就必须调用它。我想你可以从你的Being类中移除两个字符串的构造函数,但这确实是一个设计决定。

HTH

1

每个构造函数都必须在超类中调用构造函数。如果你不调用它,默认的构造函数(no-args one)将被隐式调用。

在你的情况下,存在超类没有无参数的构造函数,所以你必须调用字符串,明确字符串之一,例如:

public class Monster extends Being { 
    public Monster() { 
     super("foo", "bar"); 
    } 
} 

Being声明一个无参数的构造函数。

你应该记住关于java的奇怪的事情是,如果你没有指定任何构造函数,那么一个no-args之一是隐式定义的,但是当你用args定义一个构造函数时,隐式的no-args构造函数会消失!这抓住了大多数新的Java程序员。

+0

因此,如果在Being.java中添加了一个公有的Being()方法,那么我尝试了它应该工作? 编辑:试过了,它的工作原理,谢谢! – tanishalfelven

+0

是的。奇怪的是,如果你没有指定任何构造函数,一个无参数定义是隐式定义的,但是当你用args定义一个构造函数时,隐含的无参数构造函数会消失!这引出了大多数新的java程序员(我也被抓到了!) – Bohemian

+0

是的,它们都很漂亮......我以前玩过这些东西,并且一直很好,所以我有点害怕......但是无论如何谢谢! – tanishalfelven

0
  1. 显式调用Being构造函数(通过super("aname","aRace");
  2. Being

创建一个无参数的构造函数也请注意,如果您选择第二个选项,nameracenull

相关问题