2015-01-04 2 views
1

Как известно, локальные классы являются внутренними классами. JLS 14.3Понимание локальных классов в Java

Все локальные классы являются внутренними классами (§8.1.3).

Что внутренний класс является

JLS 8.1.3

Внутреннего класс С является прямым внутренним классом класса или интерфейса O, если вывода непосредственно вмещающее объявление типа С и Объявление C не встречается в статическом контексте.

Класс С является внутренним классом класса или интерфейса O, если это либо прямого внутреннего класса O или внутренний класс из внутреннего класса О.

Это означает декларацию внутреннего класса не должно происходить в нестационарном контексте. Но рассмотрим следующую программу:

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

DEMO

Несмотря на объявленный в статическом контексте declartion из Foo класса отлично. Хотя невозможно, чтобы внутренний класс был объявлен в статическом контексте.

+0

@Eran It .. – Maroun

+0

какой у вас вопрос? –

+0

Я * думаю * это то, что ОП после, но пинг меня, если он нуждается в повторном открытии. – chrylis

ответ

2

Классы, определенные в блоке, называемом локальными классами, могут отображаться в любом месте блока метода. Подробнее на official docs - Local Classes:

Местных классов являются классами, которые определены в блоке, который является группы из нуля или более операторов между сбалансированными скобками. Вы, , обычно находите локальные классы, определенные в теле метода.

Существует очень похожий пример для вашего случая.

Вы также можете увидеть JLS - 14.3. Local Class Declarations:

местного класса является вложенным классом (§8), который не является членом какого-либо класса и имеет имя (§6.2, §6.7).

2

Локальные классы - это классы, которые определены в блоке, который представляет собой группу из нуля или более операторов между сбалансированными фигурными скобками. Обычно вы обнаружите локальные классы, определенные в теле метода.

Смотреть это oracle link

Локальные классы похожи на внутренние классы, потому что они не могут определять или объявлять какие-либо статические члены.Локальные классы в статических методах, такие как класс PhoneNumber, который определен в статическом методе validatePhoneNumber, могут ссылаться только на статические члены охватывающего класса.

Вот пример: -

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 0,5).

Принимая во внимание, что JLS 15.9.5 не мешает объявить анонимные классы в статическом-контексте, мы можем сказать, что class Foo является inner class, но netiher direct inner class of a class Main ни inner class of a class Main

- Внутренний класс класса или интерфейса O

JLS 8.1.3.

Внутренний класс С является прямым внутренним классом класса или интерфейса O, если вывода непосредственно вмещающее объявление типа С и декларации C не происходит в статическом контексте.

Класс С является внутренним классом класса или интерфейса O, если это либо прямого внутреннего класса O или внутренний класс из внутреннего класса О.

любого класс, который принадлежит к этому типы классов должны появляться в нестационарном контексте. Это может быть анонимный класс, а также местный класс и т. Д., Который не появился в статическом контексте.

Смежные вопросы