在java.io.File中找不到构造函数File()

时间:2010-08-06 00:31:30

标签: java file constructor override

这可能是显而易见的,所以请耐心等待。

是的,我知道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(){

    }
}

这给了我一个错误,即使我重写了构造函数。

注意:此课程尚未完成。不要评论为什么我不需要这个或关于这个类如何无用的评论。我刚开始写这个错误之前就开始写了。

7 个答案:

答案 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编译器将不会为您生成默认构造函数。