Java:在调用超类型构造函数之前无法引用高度

时间:2015-08-21 17:35:31

标签: java subclass abstract

我试图用类,如矩形,三角形和圆形创建一个类图。但是,当我尝试编译它们时,我在所有这些中都得到了相同的错误,这让我相信错误在图类中。错误:在调用超类型构造函数之前无法引用高度。

图:

// Handle launching from a notification
    UILocalNotification *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

    // If not nil, the application was based on an incoming notifiation
    if (notification){
        NSLog(@"test...");
    }

椭圆:

public abstract class Figure{
    public double width;
    public double height;

    public Figure(double width, double height){
        this.width = width;
        this.height = height;
    }

    public abstract double area();

    public abstract double perimeter();
}

非常感谢。

6 个答案:

答案 0 :(得分:3)

因此,Ellipse的构造函数不会调用图的继承构造函数。然而,您正在尝试使用图中构造函数中赋值的图变量。您需要更新Ellipse构造函数以使用值调用super。我推荐以下内容。

public Ellipse(int w, int h){
    super(w,h);
    a = width / 2;
    b = width / 2;
}

答案 1 :(得分:0)

您需要初始化当前在图类中出现的高度和宽度。你可以通过从Ellipse专门调用Figure构造函数来做到这一点。

public Ellipse(){
    super(23, 23);
    a = width /2;
    b = height/2;
}

super()方法调用你的Figure构造函数,然后初始化高度和权重,允许你使用它们来相应地计算a和b。

答案 2 :(得分:0)

你需要在Ellipse中调用超类构造函数:

public Ellipse(){
    super(_width, _height)
    a = width/2;
    b = height/2;
}

答案 3 :(得分:0)

你需要在super

的每个子类的每个构造函数中调用Figure:作为第一件事
public Ellipse(double ewidth, double eheight){
    super(ewidth, eheight);
    a = width/2;
    b = height/2;
}

这是必要的,因为您使用widthheight,它们是Figure的成员,并且仅在Figure构造函数执行时被初始化,这是什么超级电话呢。你基本上使用了一个未初始化的变量。

那么我为什么要调用新参数ewidth而不是width?我是否将它们命名为width,父类中相同名称的字段将被同名的局部变量遮盖。在你的例子中,这不会是一个问题,因为两个构造函数中的代码路径都很简单,但是我想提高对此的认识,因为它是一个模糊错误的来源:)

答案 4 :(得分:0)

每个类都必须调用其超类的构造函数作为其自身构造函数中的第一条指令 [1]

如果超类具有默认构造函数(没有参数的构造函数),则会隐式执行此操作。但是如果它只有一个带参数的构造函数,那么你必须自己编写这个调用。您可以使用单词super并传递适当的参数来实现。

这样做是为了可以正确地初始化从超类继承的当前类的逻辑部分。

您有两种可能的解决方案:

  1. Figure添加默认构造函数。也许是默认宽度和高度为零的一个:

    public Figure() {
        this( 0.0, 0.0 );
    }
    

    如果宽度和高度有合理的默认值,这是有道理的。

  2. 更改子类的构造函数,使它们也接受(至少)宽度和高度:

    public Ellipse(double width, double height){
        super(width, height);
        a = width/2;
        b = height/2;
    }
    

    如果宽度和高度没有合理的默认值,这是有道理的。

  3. 你尝试这样做的方式,没有宽度和高度的值,所以你不可能在子类中使用它们(例如width/2将为零,因为没有任何东西放任何width中的值,因为没有人调用Figure的构造函数。在创建实例时,没有其他地方可以调用设置widthheight的超类构造函数 - 因此所有构造函数都必须首先调用它们的超类构造函数。

    [1]调用同一个类的其他构造函数之一也是可以的 - 如果它有多个 - 只要最终被调用的构造函数调用一个supeclass构造函数。

答案 5 :(得分:0)

类似的问题已经得到解答。 参考: java call superclass from a subclass constructor?

要添加一个,如果你的超类中有一个非参数化的构造函数,那么就不必对超类的构造函数进行显式调用。

同时检查:https://docs.oracle.com/javase/tutorial/java/IandI/super.html

此页面上有一条注释:如果构造函数未显式调用超类构造函数,则Java编译器会自动插入对超类的无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。对象确实有这样的构造函数,因此如果Object是唯一的超类,则没有问题。