gpt4 book ai didi

java - IIOException 如何没有无参数构造函数?

转载 作者:行者123 更新时间:2023-11-29 03:19:21 25 4
gpt4 key购买 nike

假设我们在 NoArgConstructorClass.java 文件中有一个类 NoArgConstructorClass

/* first example */
import javax.imageio.IIOException;

public class NoArgConstructorClass
{
public static void main(String[] args)
{
NoArgConstructorClass n = new NoArgConstructorClass();
IIOException e = new IIOException();
}
}

这段编译代码产生错误:没有找到适合 IIOException 的构造函数。

既然IIOException应该有一个无参数的构造函数(由编译器添加),那么为什么IIOException没有无参数的构造函数呢?

/** second example, showing that ClassB inherits a no-arg constructor from Object */
/** put in ConstructorChain.java */
public class ConstructorChain
{
public static void main(String[] args)
{
ClassB b = new ClassB();
}
}

/** put in ClassA.java */
public class ClassA
{
public ClassA()
{
System.out.println("Class A");
}
}

/** put in ClassB.java */
public class ClassB
extends ClassA
{
}

最佳答案

Q. This code on compilation produces error: no suitable constructor found for IIOException.

如果您查看 IIOException 的文档,您可以看到它没有默认(无参数)构造函数。它有 2 个构造函数,并且都是参数化的(单参数和双参数)。这就是当您尝试使用无参数构造函数创建 IIOException 实例时出现编译错误的原因。


Q. Since IIOException should inherit a no-arg constructor from Object, how it is made that there is no no-arg constructor for IIOException?

它不继承无参数构造函数。当一个类被继承时,您可以使用 super() 添加对其父类(super class)构造函数的调用,或者如果您不这样做,编译器会这样做。所以 IIOException 的构造函数看起来像这样。

public IIOException(String message) {
// if the below line is not present, the compiler adds it
super(); // This calls the parent class (IOException) constructor and since there is a no-arg constructor there, its perfectly valid
... // other code
}

我现在重新阅读了你的问题两次,我认为你正在将编译器添加的默认无参数构造函数作为从父类继承的构造函数。

JLS-8.8.9 中所述(感谢 OP 提供的链接),

如果你有一个没有构造函数的类(有或没有 arg),编译器会自己添加一个默认的无参数构造函数。 但是如果您指定带 arg 的构造函数而不指定无参数构造函数,则编译器不会向该类添加默认的无参数构造函数。举个例子吧。

class A {}

您可以使用 A a = new A() 实例化类 A 因为即使您没有指定任何构造函数,默认的无参数构造函数也会添加到类。

但是如果你的类看起来像这样,

class A {
public A(int b) {
}
}

在这种情况下,您只有一个参数构造函数。您现在可以仅使用此构造函数实例化您的类,因为编译器不会向其添加默认的无参数构造函数,因为它已经有一个构造函数(带有一个参数)。因此,A a = new A(1) 会工作,而 A a = new A() 不会。

如果您希望能够像这样创建一个实例,A a = new A(),那么您需要向您的类显式添加一个无参数构造函数,如下所示

class A {
public A(int b) { // single argument constructor
}
public A() { // no argument constructor
}
}

关于java - IIOException 如何没有无参数构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24670065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com