2014-07-04 112 views
3

我讀了一篇聲明說「一個方法被定義幷包含在一個Java類中」「但是,我很好奇這個聲明有多明確。是否可以創建一個不包含在任何類中的方法?

是否有可能在Java中創建一個不包含在類中的方法(函數)?

+1

你會怎麼稱呼它?每個方法都需要在一個類中定義,因爲在類之外沒有別的東西。 –

+0

你爲什麼懷疑? –

+0

@Dadou因爲在C#中,'struct'可以用來代替'class'。我認爲Java中沒有'struct',但爲了安全起見,我想在這裏與所有的專家覈對一下它是否確定。 – user3437460

回答

4

在Java-8之前,關於「包含在Java類中」的所有方法的陳述完全是真的。但是,隨着Java-8中lambda的引入,還有一個代碼可能會出現的地方 - lambda函數。與仍然是類的匿名類不同,lambda是一種不同類型的代碼託管實體。

Java-8增加了另一個可以出現方法的地方 - 一個接口。新的語言添加使您可以指定界面中方法的默認實現。這並不意味着你可以調用它,但你當然可以在Java-8接口中託管一些可執行代碼。就「獨立式」方法而言,沒有任何語言加法允許它們使用:所有可執行邏輯必須在之外的某個容器內,但不一定是一個類。

+0

你的意思是Java 8,不是嗎? ;-) – QueryLars

+0

如果我沒有弄錯,lamda函數在類中。接口是類。無論如何,接口總是可以有方法 - 只是在8之前,所有的接口方法都是公開的和抽象的。 – emory

+0

@emory接口絕對不是類(反正在外面反射)。就lambda表達式而言,它實際上非常棘手:編譯器很聰明,避免在lambdas不捕獲時創建幕後類。 – dasblinkenlight

0

不,方法是類的函數,必須在類中創建。

在課外,他們是非法的。

0

但是,我很好奇這個聲明有多明確。

這是非常確定的。

不,這是不可能的。方法應該在課堂上。

如果你認爲邏輯上也可以發現自己在課堂以外沒有任何東西。所以你從哪裏調用你的方法。

2

呃...不完全。你不能在編譯時做,但你可以在飛行中做到這一點。您可以即時將字節添加到類中。如果你知道Java虛擬機規範,就可以做到這一點,但我想你也許還可以與Apache的BCEL做到這一點:

http://jakarta.apache.org/bcel/index.html

也還有其他的選擇。讓你的課程抽象化,而不要實現該方法。做一個界面。但是,是的,您可以爲方法創建字節碼,並在運行時將其綁定到類。

0

不,這是不可能的。因爲Java一直是面向對象的,所以無論程序何時運行,都會在類的內部運行,以便更容易地創建和集成對象。然而,有一些面向對象的語言,您可以在類之外創建方法,例如PHP。對於PHP來說,這是因爲它從來不是以對象爲導向的,而是被改變爲以對象的方式運行。

相關問題