2016-09-18 67 views
0

給定一個類遮蔽一個內置類(如String):當我們將類名定義爲字符串時會發生什麼?

class String { 
public static void main(String[] args) { 

} 
} 

字符串不是一個關鍵字,不過,上面的程序給出了一個運行時錯誤。這是爲什麼?

+1

那麼,什麼是錯誤? – OldProgrammer

+0

字符串已經是類的名稱。 String類。這對我來說假設你想覆蓋那個類。 –

+0

@OldProgrammer錯誤是:錯誤:在類String中找不到主要方法,請將主要方法定義爲: public static void main(String [] args) 或者JavaFX應用程序類必須擴展javafx.application.Application –

回答

2

不好的事情發生,當你定義一個名爲字符串您陰影 一個java.lang.String類的類,這意味着每一個聲明的對象必須使用全限定名java.lang.String如果它指的是一個「正常的字符串」比其他將指向你定義一個..

例子是你寫的代碼:

public static void main(String[] args) { 

} 

如果這是你有,那麼編譯器會抱怨,因爲入口點的應用程序將永遠不會被發現的唯一類...

你會需要做

public static void main(java.lang.String[] args) { 

} 
定義明確的說法

這是一個非常不錯的陷阱,會打破你的脖子,所有的最大的原因是在java lang中的類不需要導入,你的代碼必須仔細書寫,並且非常容易出錯..

那個代碼將編譯,但在任何體面的代碼分析器,你會得到很多抱怨和重命名的建議s ..

我會遵循這種方式,並建議永遠不要命名你的類像標準的java類...

2

原因是因爲main方法是'特殊的',因爲它是程序的入口點。該程序的參數被指定爲具有可變數量Javajava.lang.String s,而不是您的String類。您的字符串類與類最接近,因爲它是當前類,所以當JVM預期Java的字符串時,Java會在main參數中使用您的String類,從而導致錯誤。您可以通過使用Java的字符串的完全合格的名稱防止這種情況:

public static void main(java.lang.String[] args) { 
    ... 
} 
+0

那麼,用戶定義的String類將比Libraray String類更優先? –

+0

是的,因爲它是最接近的一個,因爲它是當前類@NickSilicon – Li357

相關問題