2011-01-27 193 views
3

我只是寫這樣的構造:Java - 構造函數是靜態的嗎?

public ArchivesManager(String identifier) { 
    String[] components = String.split("\nNEW"); 
} 

但有一條錯誤消息:non-static method split(java.lang.String) cannot be referenced from a static context。我知道錯誤信息,但爲什麼構造函數是靜態的?!因爲這個String.split("\nNEW");split

回答

9

這是因爲拆分應該String對象上調用。即

String foo = "Hello, world"; 
String[] arr = foo.split(","); 
+1

哦,很明顯......我手邊有一些錯誤的文檔。 – ryyst 2011-01-27 10:13:21

2

也不是一成不變的方法

你可能需要

public ArchivesManager(String identifier) { 
    String[] components = identifier.split("\nNEW");//NOTE: components are local to const. this doesn't make sense 
} 
4

我知道的錯誤消息,但爲什麼是構造靜態?

構造函數上下文不是靜態的,但是當您使用類名限定靜態上下文時,您顯式調用split方法;即String.split(...)

你可能意味着寫:

String[] components = identifier.split("\nNEW"); 

它調用在作爲identifier通過String對象的(非靜態)上下文中的方法;即它說哪個字符串應該被拆分爲

+0

`String [] components = identifier.split(「\ nNEW」);`它會在構造函數中有意義嗎? – 2011-01-27 10:29:42

0

而不是String.split("\nNEW");您需要致電identifier.split("\nNEW");。你想分割標識符對象(這是一個字符串類型)。基本上你所說的是「拆分字符串類」,這是沒有意義的,因此編譯器抱怨。

0

這個錯誤並不意味着你的構造函數是靜態的。這意味着分割也不是一成不變的方法,你有2個呼叫thisc方法,從物體..........

3

要回答標題中的問題:

「構造函數不是成員」 [ JLS指數],所以靜態不是一個合適的概念。構造函數不是成員,因爲它們沒有被繼承(我希望靜態方法不被繼承)。從類文件的角度來看,它們是返回void的特殊實例方法。調用構造函數的Bytecode首先分配內存,複製對該內存的引用,然後在其中一個引用上調用構造函數。 (如果目標是1.4或更高版本,對於「outer this」的內部類分配並在調用構造函數之前出現final字段)。

-1

實際上,我不知道爲什麼構造函數默認是靜態的。 「Java中的思維」一書說:「儘管它沒有明確地使用static關鍵字,但構造函數實際上是一種靜態方法。」