2013-10-04 6 views
1

Я видел этот образец кода от Oracle Website о Java?Какова цель вложенных классов в Java?

public class Parent { 
    class InnerClass { 
     void methodInFirstLevel(int x) { 
      // some code 
     } 
    } 

    public static void main(String... args) { 
     Parent parent = new Parent(); 
     Parent.InnerClass inner = parent.new InnerClass(); 
    } 
} 
  • Какова цель конструкции parent.new InnerClass()?
  • Какие классы подходят для такой конструкции?

Данное название может быть ошибочным: Я все это понимаю об этой конструкции.

Я просто не понимаю, где и когда использовать эту функцию Java.

Я нашел другой синтаксис, чтобы сделать то же самое: Java: Non-static nested classes and instance.super()

Есть много в ссылках об этой структуре, но ничего о приложении.

[Ссылки]

+0

Одним из полезных применений является статический внутренний класс с именем 'Builder' для шаблона проектирования Builder ... – ppeterka

+0

Официальный учебник по Java охватывает их: http://docs.oracle.com/javase/tutorial/java/javaOO/nested .html –

+4

Не определен для Java 8, существует, вероятно, с первой версии Java –

ответ

0

Внутренние классы вложены в другие классы. Обычный класс является прямым членом пакета, класса верхнего уровня. Внутренние классы, которые стали доступны с Java 1.1, в четырех вариантах:

  • Статический член класса
  • классы члены
  • Локальные классы
  • Анонимные классы

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

public class DataStructure { 
    // create an array 
    private final static int SIZE = 15; 
    private int[] arrayOfInts = new int[SIZE]; 

    public DataStructure() { 
     // fill the array with ascending integer values 
     for (int i = 0; i < SIZE; i++) { 
      arrayOfInts[i] = i; 
     } 
    } 

    public void printEven() { 
     // print out values of even indices of the array 
     InnerEvenIterator iterator = this.new InnerEvenIterator(); 
     while (iterator.hasNext()) { 
      System.out.println(iterator.getNext() + " "); 
     } 
    } 

    // inner class implements the Iterator pattern 
    private class InnerEvenIterator { 
     // start stepping through the array from the beginning 
     private int next = 0; 

     public boolean hasNext() { 
      // check if a current element is the last in the array 
      return (next <= SIZE - 1); 
     } 

     public int getNext() { 
      // record a value of an even index of the array 
      int retValue = arrayOfInts[next]; 
      //get the next even element 
      next += 2; 
      return retValue; 
     } 
    } 

    public static void main(String s[]) { 
     // fill the array with integer values and print out only 
     // values of even indices 
     DataStructure ds = new DataStructure(); 
     ds.printEven(); 
    } 
} 
+2

Это предложение «позволяет превращать вещи в объекты, которые вы обычно не превращаете в объекты», не имеет для меня большого смысла. –

+0

См. Мое редактирование, на примере, отлично иллюстрирующем это предложение – Heaven42

+0

Я не вижу, как это иллюстрирует это предложение; можно было бы задаться вопросом, нужно ли создавать итератор для создания итератора. –

2

Какова цель parent.new InnerClass()?

Это для демонстрации - использование этого механизма для создания внутреннего класса встречается редко. Обычно внутренние классы создаются только внешним классом, когда он только что создан с new InnerClass(), как обычно.

Какие классы подходят для такого строительства?

Посмотрите на Map.Entry<K,V> для классического примера. Здесь вы можете увидеть внутренний класс с именем Entry, который должен быть создан всеми классами, которые реализуют Map.

+0

Структура, представленная в образце, требует создания экземпляра 'Parent' перед созданием экземпляра' InnerClass'. Я не понимаю ссылку с Map.Entry? – chepseskaf

+0

@chepseskaf - для нестатических внутренних классов у каждого из них есть соединение с его родителем, чтобы он мог обращаться к родительским полям и методам, поэтому родительский ** должен существовать ** для каждого дочернего объекта, к которому он привязан. Имеет смысл включить класс «Entry» в класс «Карта», потому что каждый тип «Карты», вероятно, имеет разные типы «Ввод». – OldCurmudgeon

+1

Я рядом с @chepseskaf, и мы полностью раскрываем, что такое внутренний нестатический класс и его связь с его родителем. То, что мы не можем понять, - это то, почему кто-то инициирует родителя, а затем __need to__ инициирует InnerClass из родительского экземпляра. Это сильно отличается от примера Map.Entry. Какой прецедент понадобится такой технике? – Pigelvy

1

Здесь я вижу много ответов, объясняющих использование внутренних классов, но, насколько я вижу, речь идет о конкретной конструкции parent.new InnerClass().

Причина этого синтаксиса очень проста: экземпляр внутреннего класса должен принадлежать экземпляру окружающего класса. Но так как main - статический метод, нет никакого окружающего объекта Parent. Поэтому вы должны явно указать этот объект.

public static void main(String[] args) { 
    // this results in an error: 
    // no enclosing instance of type Parent is available 
    InnterClass inner = new InnerClass(); 

    // this works because you specify the surrounding object 
    Parent parent = new Parent(); 
    InnerClass inner = parent.new InnerClass();  
} 

Я ищу для использования этой конструкции в стандартных пакетах, но до сих пор я не нашел пример.

+0

Вы, кажется, понимаете вопрос, но ваш ответ касается самой техники, а не уместности/использования этой техники. – Pigelvy

+1

@ Пигелви вы правы. Причина в том, что я не вижу использования этого синтаксиса. Каждый пример, который я придумал, можно решить без него ... –

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