1

我的代码 -

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 中创建必要的构造函数,它就会成功。但是,我想知道原因。

4

5 回答 5

5

您描述的行为的主要原因是Java构造函数没有被继承。创建类时,您有两种选择:

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

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

在您的示例中,您没有在 class 中定义任何构造函数Level2Class,因此编译器添加了不带参数的默认构造函数。double编译后的类中不存在带参数的构造函数,因此您的错误Constructor undefined

于 2012-12-14T09:02:49.773 回答
3

Level2Class有一个由编译器实现的唯一默认构造函数。Level2Class没有以 double 作为参数的构造函数。

Level2Class l2c = new Level2Class(10.0D);

这将尝试找出Level2Class类中不可用的双重构造函数,因为构造函数没有被继承。

于 2012-12-14T09:00:23.760 回答
2

在 Level2Class 类中创建一个带双参数的构造函数

public class Level2Class extends Level1Class
{
   Level2Class (double val)
   {
     // body of the constructor
   }
} 
于 2012-12-14T09:12:45.810 回答
1

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

在编译你的代码后简单地说就像:

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

所以你必须声明构造函数Level2Class(double) { super(double) }才能使它工作

于 2012-12-14T09:06:10.773 回答
1

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

于 2012-12-14T09:06:20.610 回答