在调用超类型构造函数之前,不能引用roomNumber

时间:2011-11-18 11:36:29

标签: java abstract-class super

我创建了两个类StandardFamily,它们扩展了抽象类Room,在编译Standard类时我遇到了错误“在超类型之前无法引用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;
   }
}

3 个答案:

答案 0 :(得分:5)

super(theNumber, roomNumber);

调用超级构造函数时,它必须是你做的第一件事。您正尝试将私有字段roomNumber作为参数发送。

在旁注中,Room构造函数采用int和boolean值,而您发送两个整数。

public Room(int roomNumber, boolean enSuite)

答案 1 :(得分:4)

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

当你编写它时,编译器将搜索有两个int parameter的超级构造函数,但是没有这样的构造函数。您的构造函数有一个int和一个Boolean

public Room(int roomNumber, boolean enSuite)

在Java 如果父构造函数由于任何条件而无法进行调用,则编译器应将其显示为错误。

来自JLS-8.8.7.1

  

构造函数体中的显式构造函数调用语句可能不引用此类或任何超类中声明的任何实例变量或实例方法或内部类,或者在任何表达式中使用this或super;否则,发生编译时错误。   因此,请更改构造函数参数或创建一个新参数...

答案 2 :(得分:3)

您在Standard中引用roomNumber,只有在Room()的构造函数完成处理后才由JVM处理。只有所有超类的构造函数成功返回后,类级变量才会由JVM处理和初始化。所以你的调用链是这样的:

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

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