2011-11-18 66 views
2

我已经创建了两个类StandardFamily其扩展抽象类Room,编译Standard类我正在遇到错误时“不能超构造函数之前引用roomNumber被称为”但我不明白为什么,任何帮助将不胜感激。不能引用roomNumber前超构造函数被称为

Room

public abstract class Room 
{ 
    public int roomNumber; 
    public String roomType; 
    public boolean ensuite; 
    public boolean available; 

public Room(int roomNumber, boolean enSuite) 
    { 
     this.roomNumber = roomNumber; 
     ensuite = enSuite; 
     available = false; 
    } 
} 

Standard

public class Standard extends Room 
{ 
    private int roomNumber; 
    private int childCap; 
    private int adultCap; 



public Standard(int theNumber, int kidsCap, int adultsCap) 
    { 
     super(theNumber, roomNumber); 
     childCap = childsCap; 
     adultCap = AdultsCap; 
    } 
} 
+1

为什么你重新声明标准类中的roomNumber?我认为这是问题 – kol

+1

PS这有你可能希望清理的一些问题。标准构造函数有两个编译错误。您将roomNumber代替“enSuite”作为参数 - 它们甚至不是同一类型。你的“ensuite = enSuite”声明令人困惑,因为名字不同,只有一个字母的情况,使用公共字段是一个禁忌,最后在子类中隐藏一个私有的公共字段势必造成混淆! –

+0

谢谢你们,花了一段时间,但我明白你的意思,我已经解决了这个问题 –

回答

5

super(theNumber, roomNumber);

调用超级构造函数时,它一定是你做的第一件事。您正试图将私人空间roomNumber作为参数发送。

在侧面注释中,Room构造函数接受一个int和一个布尔值,而您发送两个整数。

public Room(int roomNumber, boolean enSuite)

4
super(theNumber, roomNumber);//both are int 

当你写这篇文章时,编译器会为有两个int parameter超级构造进行搜索,但没有这样的构造。你的构造函数有一个int和一个Boolean

public Room(int roomNumber, boolean enSuite) 

在Java 如果父类的构造不能拨打电话,由于任何条件,那么编译器应该显示为错误。

JLS-8.8.7.1

在构造函数体中一个明确的构造函数调用语句可能不是指这个类中声明的实例变量或实例方法或内部类或超类,或使用本或超任表达;否则,会发生编译时错误。 因此改变你的构造函数的参数或做一个新的...

3

你引用的标准,曾经室的构造函数()已完成处理只能由JVM处理roomNumber。只有所有超类的构造函数都成功返回后,才能由JVM处理和初始化类级变量。所以,你的调用链是这样的:

标准() - >间() - > [初始化室的成员变量] - >从客房()返回 - > [初始化标准的成员变量]

因此,您不能将roomNumber传递给Room,因为实际上它不会存在。