这可能是显而易见的,所以请耐心等待。
是的,我知道java.io.File没有默认构造函数 问题是,当我尝试扩展java.io.File时,它说“无法在java.io.File中找到构造函数File()”,即使我重写了java.lang.Object中的默认构造函数。
这是我的代码:
AbsRelFile.java
import java.io.File;
public class AbsRelFile extends File {
File f;
private AbsRelFile(){
}
}
这给了我一个错误,即使我重写了构造函数。
注意:此课程尚未完成。不要评论为什么我不需要这个或关于这个类如何无用的评论。我刚开始写这个错误之前就开始写了。
答案 0 :(得分:8)
因为你没有在默认构造函数中对super(...)
进行显式调用,所以它隐式地试图调用超类的默认构造函数,正如你所指出的那样,它在这个中不存在case(super为File
)的情况。您的问题的解决方案是在默认的AbsRelFile()
构造函数中调用超级构造函数。如果您不想为您的班级提供默认构造函数,则需要使用某些默认值调用super(...)
。
答案 1 :(得分:5)
当您定义构造函数时,Java会将超级构造函数的隐式调用作为构造函数的第一行插入。所以你的构造函数相当于:
private AbsRelFile(){
super();
}
由于超类File
中没有默认构造函数,因此会出错。要解决此问题,您需要将超类构造函数的显式调用作为第一行:
private AbsRelFile(){
super("fileName");
}
最有可能的是,您还必须为AbsRelFile
构造函数定义一些合适的参数,您可以将其传递给超级调用。
另一方面,构造函数不能被覆盖。所以说你覆盖Object
类构造函数是错误的。您只是为AbsRelFile
类定义了一个构造函数。
答案 2 :(得分:1)
默认情况下,构造函数如果不自己进行超级构造函数调用,则调用超类的默认构造函数。
为避免这种情况,请调用File的实际定义的构造函数。
答案 3 :(得分:1)
Java会自动在空构造函数中调用super(),这就是你得到错误的原因。
答案 4 :(得分:0)
问题是你的AbsRelFile
构造函数是尝试来调用File
的no-args构造函数。你所写的内容相当于
private AbsRelFile() {
super();
}
您需要确保显式调用 存在的File
构造函数之一。例如:
private AbsRelFile() {
super("dummy");
}
显然,您需要找出一个安全/无害/适当的超类构造函数和用于特定用例的参数。 (我不知道AbsRefFile
究竟应该是什么......所以我不能就此提出建议。)
除此之外 - 你不“覆盖”构造函数。构造函数永远不会在Java中继承,因此覆盖在这里不适用。相反,您在子类中声明构造函数,并通过显式super(...)
调用将它们链接到直接超类中的相应构造函数...或者默认情况下Java插入的隐式构造函数。
答案 5 :(得分:0)
首先,我希望您的字段“File f”与尝试访问超类无关,而是与'Rel'或'Abs'有关。
其他海报正确地指出你的隐式默认构造函数(AbsRelfile())将尝试调用super() - 它不存在。所以唯一的解决方案是创建一个传递一些有效参数的构造函数。
如果你试图'包装'整个java.util.File类(比如在创建自己的Exception时),你应该为每个原始构造函数提供一个包装器。像Eclipse这样的现代IDE应该右键单击它。
请注意,File不要求给定的文件名存在,特别是当您想要执行file.mkdir()等操作时,它不存在。
如果您需要一个实际的临时文件,您可以随时执行以下操作:
public class AbsRelFile() {
public AbsRelFile() {
super(File.createTempFile("AbsRelFile", "tmp").getAbsolutePath());
}
}
..但我很困惑你为什么要首先将File子类化。
答案 6 :(得分:0)
在一行中解释为什么: 当您使用参数定义构造函数时(如在File类中),Java编译器将不会为您生成默认构造函数。