我的代码 -
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中创建必要的构造函数,它将会发生。但是,我想知道原因。
答案 0 :(得分:5)
您描述的行为的主要原因是Java构造函数不是继承的。创建课程时,您有两种选择:
根本不指定任何构造函数(如示例所示)。在这种情况下,编译器将自动添加默认构造函数(没有参数)。
创建特定构造函数(带参数或不带参数)。在这种情况下,只有您定义的构造函数将存在于类中,编译器不会添加默认构造函数。
在您的示例中,您没有在类Level2Class
中定义任何构造函数,因此编译器添加了没有参数的默认构造函数。编译类中不存在参数double
的构造函数,因此您的错误构造函数未定义。
答案 1 :(得分:3)
Level2Class
只有一个默认的构造函数,可以由编译器实现。 Level2Class
没有构造函数,它将double作为参数。
Level2Class l2c = new Level2Class(10.0D);
这将试图找出Level2Class
类中的双构造函数,因为构造函数不是继承的,所以它不可用。
答案 2 :(得分:2)
在Level2Class类
中创建一个带有double参数的构造函数public class Level2Class extends Level1Class
{
Level2Class (double val)
{
// body of the constructor
}
}
答案 3 :(得分:1)
java中的构造函数不是多态的,当你调用new Level2Class(10.0D)
程序找不到Level2Class(double)
它看到Level2Class()
这是本例中的默认构造函数。
简单地说在编译代码之后会像:
Level2Class {
Level2Class() { super(); }
}
所以你必须声明构造函数Level2Class(double) { super(double) }
才能使其正常工作
答案 4 :(得分:1)
在Java中,每当扩展一个类时,只继承public和protected方法,而不是构造函数。