Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个java代码有什么问题?_Java - Fatal编程技术网

这个java代码有什么问题?

这个java代码有什么问题?,java,Java,我正在学习java。我正在读的这本书有一个问题,问下面的代码有什么问题?我已经在NetBeans中输入了代码,我可以看到错误,但是为什么会出现这个错误,以及如何解决它 错误在代码公共A(int t)上突出显示,并显示 类B中的构造函数B不能应用于给定的类型,需要int,找不到任何参数,原因是实际参数和形式参数列表的长度不同 代码如下: public class Test { public static void main(String[] args) { B b = new

我正在学习java。我正在读的这本书有一个问题,问下面的代码有什么问题?我已经在NetBeans中输入了代码,我可以看到错误,但是为什么会出现这个错误,以及如何解决它

错误在代码
公共A(int t)
上突出显示,并显示

类B中的构造函数B不能应用于给定的类型,需要int,找不到任何参数,原因是实际参数和形式参数列表的长度不同

代码如下:

public class Test {
    public static void main(String[] args) {
       B b = new B(5);
    }
}

class A extends B {
    public A(int t)  {
        System.out.println("A's constructor is invoked");
    }
}

class B  {
    public B(int k)   {
        System.out.println("B's constructor is invoked");
    }
}

您需要调用超类的构造函数作为
A(int)
中的第一条语句:


当您的
super类
具有
args构造函数
且没有无args构造函数时,您必须使用子类构造函数的
super(args)
调用显式调用它

class A extends B {
     public A(int t)  {
         super(t);
            System.out.println("A's constructor is invoked");
        }

}

类B已经定义了构造函数,所以它没有公共隐式默认构造函数(没有参数)。如果零参数超类构造函数不可用,则所有子类构造函数必须通过
super(t)
显式调用超类构造函数。

类B只有一个构造函数采用
int
参数。另一方面,类A中的构造函数(隐式)尝试调用A的超类(即B)中不带参数的构造函数。这就是错误的原因。至少有两种方法可以解决此问题:

  • 在类B中创建一个无参数构造函数

  • 显式调用类B中以int作为参数的构造函数。您可以使用
    super
    关键字执行此操作


  • a
    B
    之间有一个契约,
    a
    必须调用
    B
    的构造函数,将
    int
    值传递给它…更新
    a
    s构造函数以包含
    super(t)作为第一句话谢谢你的回答。我明白,但我也问自己为什么?为什么子类构造函数必须显式调用超类构造函数?这是什么原因?对不起,所有的问题。它需要尊重家长类的需要。父类simple说,“如果不向我提供此信息,就不能实例化我”。子类有权创建具有或多或少参数的新构造函数,但它必须满足父类的要求。错误消息非常清楚。你不明白什么?非常感谢大家。@JohnW一定要对你觉得有用的答案进行投票,并接受其中一个作为“官方”答案。谢谢你的回答。我明白,但我也问自己为什么?为什么子类构造函数必须显式调用超类构造函数?这是什么原因?对不起,有这么多问题。@JohnW是关于合同的。超类可以有一些“不变量”——一些属性总是真的,比如“field
    x
    不是
    null
    ”。如果不调用构造函数,就无法确保它们,其他应用程序也无法依赖它们。
    class A extends B {
         public A(int t)  {
             super(t);
                System.out.println("A's constructor is invoked");
            }
    
    }