以下java代码有什么问题?

时间:2015-03-21 18:39:32

标签: java inheritance constructor

编译时我遇到了一些参数错误。不知道这有什么不妥。

我原以为输出会是bj。因为类a没有默认构造函数所以在编译时,默认构造函数将由JVM创建。剩下的输出是bj。我错过了什么吗?

class a
{

    a(String b)
    {
        System.out.println("this is a");
    }
}
class b extends a
{
    b()
    {
        System.out.println("b");
    }
}

class c extends b
{
    c(String j)
    {
        System.out.println(j);
    }
    public static void main(String...k)
    {
        new c("J");
    }
}

错误如下所示:

javac construct.java
construct.java:12: error: constructor a in class a cannot be applied to given ty
pes;
        {
        ^
  required: String
  found: no arguments
  reason: actual and formal argument lists differ in length
1 error

2 个答案:

答案 0 :(得分:4)

  

因为类a没有默认构造函数所以在编译时默认构造函数将由JVM创建

只有在未定义自定义构造函数时才会创建默认构造函数

您的IDE应该在b()声明中显示以下消息:

  

' .a'

中没有默认构造函数

当您尝试实例化b时,它会对super()进行隐式调用,但只找到a(String b)而不是a()。正如错误消息所示,a(String b)期望String但没有参数。

解决方案是创建无参数a()构造函数或调用类a(String b)构造函数中的b构造函数。

class b extends a
{
    b()
    {
        super(""); // call to class a constructor passing some string as argument
        System.out.println("b");
    }
}

答案 1 :(得分:0)

按照惯例,您应该使用大写字母命名Java类

执行new C("J");时,它会调用class C的构造函数。但是当class C扩展class B时,JVM将添加

C(String j)
{
    super(); //added by JVM - calls the constructor of super class
    System.out.println("j");
}

因此调用了类b的构造函数,因为它也在扩展class A

B()  
{  
   super();  //added by JVM
   System.out.println("b");
}

现在出现了问题。由于JVM将在其隐式调用中添加默认构造函数。但是没有使用无参数定义的构造函数。这就是你收到错误的原因。您可以在构造函数B中添加super("");以解决错误或创建不带参数的构造函数。