2015-01-04 28 views
1

正如所知,本地類是內部類。 JLS 14.3瞭解Java中的本地類

所有本地類都是內部類(第8.1.3節)。

什麼內部類是是

JLS 8.1.3

內部類C是直接內部類的類或接口的O如果 O爲C的立即封閉類型聲明和C的 聲明不會出現在靜態上下文中。

C類一個內部類的類或接口ö如果它要麼是一個 直接內部類的O或內部類的內部類O.

的,這意味着該聲明的內部類不應該出現在非靜態的上下文中。但是,考慮下面的程序:

public static void main (String[] args) throws java.lang.Exception 
{ 
    class Foo{ } //occured in the static-context 
} 

DEMO

儘管在靜態情況下被宣佈時,Foo類的declartion是好的。雖然內部類不可能在靜態上下文中聲明。

+0

@Eran它確實.. – Maroun

+0

什麼是你的問題? –

+0

我*認爲*這是OP後,但平如果它需要重新打開。 – chrylis

回答

2

類中定義的類名爲本地類,它們可以出現在方法塊的任何位置。閱讀來自official docs - Local Classes

本地類是在一個塊,這是一個 組的平衡支架之間的零份或多個聲明中定義的類。您通常會在方法的主體中找到定義的本地類。

你的情況有一個非常相似的例子。

您還可以看到JLS - 14.3. Local Class Declarations

一個當地類是嵌套類(§8)不屬於任何類 的成員,並且有一個名字(§6.2§6.7)。

2

本地類是在塊中定義的類,它是一組零或多個平衡花括號之間的語句。您通常會在方法的主體中找到定義的本地類。

看到這個oracle link

本地類相似,內部類,因爲他們不能定義或聲明的任何靜態成員。靜態方法中的本地類,例如在靜態方法validatePhoneNumber中定義的PhoneNumber類,只能引用封閉類的靜態成員。

這裏是例如: -

public class localInner1{ 
private int data=30;//instance variable 
void display(){ 
    class Local{ 
    void msg(){System.out.println(data);} 
    } 
    Local l=new Local(); 
    l.msg(); 
} 
public static void main(String args[]){ 
    localInner1 obj=new localInner1(); 
    obj.display(); 
} 
} 
1

內部類其它類內的類窩。一個普通的類是一個包,一個頂級類的直接成員。的java有四個類型內部類即

Static member classes 
Member classes 
Local classes 
Anonymous classes 

本地類的代碼塊中聲明和只在該塊是可見的,正如任何其他方法變量。

2

我想我混淆了兩個相似但不同的概念。他們是:

- 內部類

通過JLS 8.1.3定義。

內部類是一個嵌套類,它不是明確或隱含地聲明爲 聲明爲靜態。

現在,我們可以看到,

內部類可以是非靜態成員的類(第8.5節),局部類 (§14.3),或一個匿名類(§15.9 .5)。

考慮到JLS 15.9.5並不妨礙靜態上下文內聲明匿名類,我們可以說,class Fooinner class,但netiher direct inner class of a class Main也不inner class of a class Main

- 內部類類或接口O

定義於JLS 8.1.3

內部類C是直接內部類的類或接口的O如果 O爲C的立即封閉類型聲明和聲明 的C不以靜態上下文發生。

C類是一個內部類的類或接口ö如果它要麼是一個 直接內部類的O或內部類的內部類O.

屬於此的任何類的種類應該出現在非靜態的上下文中。它可能是一個匿名的班級,也可能是一個地方班級等等,而這個班級並沒有出現在一個有條理的環境中。