2012-12-14 32 views
1

我的代码 -错误 - 构造Level2Class(双)是未定义

public abstract class Level1Class 
{ 
    protected double num = 0.0D; 
    protected Level1Class(){} 
    protected Level1Class(double num){this.num = num;} 
    protected abstract methods A, B, C...etc //pseudocode ! 

} 

public class Level2Class extends Level1Class 
{ 
    //NO CONSTRUCTORS HERE 
    //BUT, only implementation of methods A,B, C 
} 

public class Tester 
{ 
    Level2Class l2c = new Level2Class(10.0D); //This causes the compiler error ! 
} 

谁能告诉我,为什么我得到这个错误。我知道它会去,如果我在Level2Class中创建必要的构造函数。但是,我想知道原因。

+3

双参数创建一个构造函数的误差不'Level2Class(双)'现有构造的结果。构造函数不会像常规方法那样继承。 – Vulcan

回答

3

Level2Class有一个唯一的默认构造函数,它将由编译器实现。 Level2Class没有带双参数的构造函数。

Level2Class l2c = new Level2Class(10.0D); 

这会揣摩双重构造函数Level2Class类,因为构造函数是不能继承的是不可用的。

+0

(原因:与常规方法不同,构造函数*不*继承。) – 2012-12-14 09:01:13

5

您描述的行为的主要原因是在Java构造函数中没有继承。当你创建一个类时,你有两个选择:

  1. 根本不指定任何构造函数(如在你的例子中)。在这种情况下,编译器会自动添加一个默认构造函数(不带参数)。

  2. 创建特定的构造函数(带参数或不带)。在这种情况下,只有您定义的构造函数存在于类中,编译器不会添加默认构造函数。

在你的榜样,你是不是在定义类Level2Class任何构造函数,因此编译器添加不带参数的默认构造函数。参数double的构造函数不存在于已编译的类中,因此您的错误构造函数未定义

1

java中的构造函数不是多态的,当你调用new Level2Class(10.0D)程序找不到Level2Class(double)它看到Level2Class()在这种情况下它是默认的构造函数。

编译你的代码后,只是说会是这样:

Level2Class { 
    Level2Class() { super(); } 
} 

所以你必须以声明的构造Level2Class(double) { super(double) }这个工作

1

在Java中,当一个类被扩展,只有公共和受保护的方法是继承的,但不是构造函数。

2

在Level2Class类

public class Level2Class extends Level1Class 
{ 
    Level2Class (double val) 
    { 
    // body of the constructor 
    } 
}