2010-08-06 76 views
0

這可能很明顯,請耐心等待。在java.io.File中找不到構造函數File()

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

嘗試在AbsRelFile構造函數中顯式調用File構造函數,就像在創建AbsRelFile對象時一樣,它將查找匹配的super()構造函數,並且File中沒有這樣的構造函數是) – Ross 2010-08-06 00:37:15

+0

重寫一個超類的構造函數是不可能的。無論超類所具有的構造函數都將停留在那裏,而與您的子類定義的構造函數無關。因此,你不能向超類添加一個新的構造函數(比如默認構造函數)。 – Lajnold 2010-08-06 00:42:26

+0

我會考慮這個班級的名字。擊鍵很便宜。就我個人而言,我與「AbsRelFile」有一些心理上的不和諧。 「絕對相對文件」?如果我是這個班級的客戶,我不知道這個名字是什麼。名稱很重要 - 再試一次。 – duffymo 2010-08-06 00:47:17

回答

8

因爲您沒有在默認構造函數中明確調用super(...),所以它隱式地嘗試調用超類的默認構造函數,正如您指出的那樣,在這種情況下不存在超級是一個File)。解決您的問題的方法是在默認的AbsRelFile()構造函數中調用超級構造函數。如果您不想爲您的課程提供默認構造函數,則需要使用某些默認值調用super(...)

+0

有沒有辦法讓它可以調用super.super()或者什麼? – 2010-08-06 00:41:52

+0

要調用超級構造函數,只需用'super'替換類的名稱即可。例如,如果有'File(String filename)',那麼你的類會做類似'super(「theDefaultFile」)'的東西。 – 2010-08-06 01:15:52

+0

「有沒有辦法讓它可以調用super.super()或其他?」 - 不,你不能調用不存在的方法/構造函數。 – 2010-08-06 02:03:19

1

構造函數默認情況下調用超類的默認構造函數,如果你不自己調用超構造函數。

爲了避免這種情況,請調用實際定義的File構造函數。

1

Java會自動在你的空構造函數中調用super(),這就是爲什麼你會得到錯誤。

0

問題是您的AbsRelFile構造函數是嘗試使用來調用File的無參數構造函數。什麼你寫相當於

private AbsRelFile() { 
    super(); 
} 

你需要確保你明確調用File構造的一個確實存在。例如:

private AbsRelFile() { 
    super("dummy"); 
} 

很顯然,你需要找出一個安全/無害/合適的父類的構造和參數使用您的特定用例。 (我不知道什麼AbsRefFile真的應該是...所以我不能建議這一點。)

另外 - 你不要「重寫」構造函數。構造函數永遠不會在Java中繼承,因此覆蓋不會在這裏適用。相反,您需要在子類中聲明構造函數,並通過明確的super(...)調用將它們鏈接到直接超類中的相應構造函數...或默認插入的隱式構造函數。

5

當你定義一個構造函數時,Java會向超構造函數插入一個隱式調用,作爲構造函數的第一行。由於在超類File沒有默認構造函數,它給出了一個錯誤

private AbsRelFile(){ 
    super(); 
} 

:所以你的構造方法等效於。爲了解決這個問題,你需要顯式調用的地方,超類構造函數的第一行:

private AbsRelFile(){ 
    super("fileName"); 
} 

最可能的是,你必須定義AbsRelFile構造一些合適的參數太多,你可以通過超呼叫。

另一方面,構造函數不能被覆蓋。所以說你重寫Object類構造函數是錯誤的。你只需要定義一個AbsRelFile類的constrcutor。

0

首先,我希望你的領域「文件F」是沒有關係的試圖訪問父的事,但與「版本」或「阿布斯」做..

其他海報已經正確地指出你的隱式默認構造函數(AbsRelfile())會嘗試調用super() - 它不存在。所以唯一的解決方案是構造一個傳遞一些有效參數的構造函數。

如果您試圖「包裝」整個java.util.File類(就像創建自己的Exception時一樣),您應該爲每個原始構造函數提供一個包裝。像Eclipse這樣的現代IDE應該有一個右鍵單擊。

請注意,文件不需要給定的文件名存在,特別是當您想要執行像file.mkdir()這樣的操作時它不存在。

如果你需要一個實際的,臨時文件一起工作,你總是可以這樣做:

public class AbsRelFile() { 
    public AbsRelFile() { 
      super(File.createTempFile("AbsRelFile", "tmp").getAbsolutePath()); 
    } 
} 

..但我很困惑,爲什麼你要繼承的文件擺在首位。

0

要在一行中解釋WHY: 當您使用參數定義構造函數(如在File類中)時,Java編譯器不會爲您生成默認構造函數。

相關問題