2015-06-12 2 views
2

Я работаю на уроках в Java и не смог полностью понять, что происходит на следующем уроке.For-Each Loop Alternative - Уточнение

Назначение: Цель этого урока - объяснить, как работает каждый цикл, создавая альтернативу, которая моделирует, как будет работать цикл for-each.

В предыдущем уроке, объяснение для-каждого цикла был прост:

import java.util.ArrayList //Imports ArrayList CLASS 

public class ForEachLoops 

{ 

    public static void main(String[] args) 
    { 

     ArrayList<Integer> numbers = new ArrayList<Integer>(); 
     //^Creates ArrayList object & calls constructor 
     for(int i = 1; i < 11; ++i) 
      numbers.add(i); //Just adding numbers 1-10 to the ArrayList. 


     for(int n : numbers) //For-Each Loop 
      System.out.println(n); //Returns value from each ArrayList element 


    } 

} 

В следующем занятии инструктор показывал, как создать альтернативный/симулятор петли для-каждой. Она работает следующим образом:

import java.util.ArrayList; //Importing ArrayList class from package 
import java.util.Iterator; // Question 1 (See Below) 

public class Chap16Part9 
{ 

    public static void main(String[] args) 
    { 

     ArrayList<Integer> numbers = new ArrayList<Integer>(); 
     //^Creating object of ArrayList & calling constructor 

     for(int i = 1; i < 11; ++i) 
      numbers.add(i); //Just adding numbers 1-10 to ArrayList object 

     for(Iterator<Integer> n = numbers.iterator(); n.hasNext();) { 
    //  ^Question 2 (See Below) 
      int num = n.next(); //Points to the next element to assign value. 
      System.out.println(num); //Prints current value of "num." 
     } 

    } 

} 

Вопрос 1: После прочтения документации Java, «Итератор» приведен в качестве интерфейса. Это все равно то же самое, что импортировать класс? Например, в документации Java «java.util.Scanner» считается классом, а не интерфейсом.

Вопрос 2: Прежде чем задать вопрос, цикл не нуждается в контроле типа «++ i», поскольку метод hasNext() Итератора проверяет, есть ли другой элемент для проверки. Если нет, то он останавливается. Это логическое значение. Однако в начале цикла переменная управления контуром (LCV) равна «Iterator<Integer> n = numbers.iterator();», и я не совсем понимаю, что это означает. На мой взгляд, я вижу объект класса Итератора? устанавливается равным методу итератора ArrayList(). Может быть, потому, что данный «java.util.Interator»; рассматривается как интерфейс (в основном контракт, который объявляет методы, которые должны быть реализованы, если он реализуется классом), класс ArrayList завершает набор операторов заявленных методов iterator() в классе ArrayList и, следовательно, должен называться таким образом вместо конструктора, как называются традиционные классы (например, ArrayList)? Я немного смущен этим, и я надеюсь, что кто-то сможет пролить свет на это. Спасибо!

+0

для «итератора п = numbers.iterator()» Я имел в виду, чтобы напечатать ".. Итератор n = numbers.iterator() " –

+1

Во избежание проблем с' 'обрабатывается как тег HTML, который вместо показа интерпретируется всегда, обертывая фрагмент кода с помощью' \ ''. – Pshemo

+0

[Учебник для каждого] (https://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html) объясняет это хорошо. –

ответ

2

Ссылочные типы Java включают классы, интерфейсы и перечисления (а также массивы, но они немного разные). Все они представляют собой фрагменты кода, которые определяют поведение, и поэтому их необходимо импортировать для вашей программы, чтобы знать, какие методы доступны в них и т. Д.

Таким образом, интерфейс, такой как Iterator, содержит код, в котором указаны методы и константы определяемые в нем, какие параметры принимают методы, какие типы они возвращают и т. д. Компилятор должен знать все это, чтобы иметь возможность проверить правильность вашей программы и генерировать правильные вызовы этим методам в создаваемом им байт-коде.

Метод iterator() в List возвращает итератор по элементам в этом списке. То есть объект из класса, который реализует Iterator. Вы не знаете, какой класс был бы и как он реализован, - эта информация инкапсулирована в код конкретного списка, но вы знаете, что она реализует Iterator и поэтому имеет все методы, объявленные в Iterator, и реализует их в соответствии с договором Iterator ,

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

Iterator<Integer> n = numbers.iterator(); 

Это именно так. Он говорит: «Объявите n как переменную типа интерфейса Iterator<Integer>. Задайте список для своего итератора numbers и назначьте его n. Таким образом, ваша« переменная цикла »на самом деле является объектом Iterator. Потому что вы знаете, что это тип Iterator - реализует Iterator контракт - вы знаете, что вы можете использовать hasNext() и next() на нем и это то, что вы делаете в проверке состояния контура и в следующей строке

1

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

Представьте, что у вас есть фабрика шаров. Он может выкачать теннисные мячи и баскетболы, которые являются вашими классами. Но когда делаются как теннис, так и баскетбольные, у них есть такие же свойства, как isRound() и bounce() и т. Д. Интерфейс подобен тому, что эти свойства группируются под именем. Таким образом, как теннисбол, так и баскетбол реализуют интерфейс Ball.

Итак, в List, который реализует итерацию, вы можете использовать итеративный метод, называемый итератором, который может проходить через элементы списка. Arraylist также получает итерабельность через наследование List.