Java 对于每个回路备选方案-澄清

Java 对于每个回路备选方案-澄清,java,loops,foreach,iterator,Java,Loops,Foreach,Iterator,我正在学习Java课程,还不能完全理解下一节课的内容 目的:本课程的目的是通过创建模拟for each循环工作方式的替代方案来解释for each循环的工作方式 在上一课中,对for each循环的解释很简单: import java.util.ArrayList //Imports ArrayList CLASS public class ForEachLoops { public static void main(String[] args) { Ar

我正在学习Java课程,还不能完全理解下一节课的内容

目的:本课程的目的是通过创建模拟for each循环工作方式的替代方案来解释for each循环的工作方式

在上一课中,对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//导入ArrayList类
公共类前循环
{
公共静态void main(字符串[]args)
{
ArrayList编号=新的ArrayList();
//^创建ArrayList对象并调用构造函数
对于(int i=1;i<11;++i)
number.add(i);//只需将数字1-10添加到ArrayList。
for(int n:number)//对于每个循环
System.out.println(n);//返回每个ArrayList元素的值
}
}
在下一课中,讲师将演示如何为每个循环创建备用/模拟器。其工作原理如下:

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."
        }

    }

}
import java.util.ArrayList//从包导入ArrayList类
导入java.util.Iterator;//问题1(见下文)
公共课第16章第9部分
{
公共静态void main(字符串[]args)
{
ArrayList编号=新的ArrayList();
//^正在创建ArrayList的对象并调用构造函数
对于(int i=1;i<11;++i)
numbers.add(i);//只需将数字1-10添加到ArrayList对象
for(迭代器n=numbers.Iterator();n.hasNext();){
//^问题2(见下文)
int num=n.next();//指向要赋值的下一个元素。
System.out.println(num);//打印“num”的当前值
}
}
}
问题1:阅读Java文档后,“迭代器”被列为接口。这仍然与导入类相同吗?例如,在Java文档中,“Java.util.Scanner”被认为是一个类,而不是一个接口


问题2:在提问之前,循环不需要实现“++i”类型的控件,因为迭代器的hasNext()方法会检查是否有其他元素需要检查。如果没有,那么就停止。这是一个布尔值。然而,循环的开始,循环控制变量(LCV)是“
Iterator n=numbers.Iterator();
”,我不太明白这是什么意思。在我眼里,我看到了迭代器类的对象?设置为等于ArrayList迭代器()方法。这可能是因为“java.util.Interator;”被视为一个接口(基本上是一个包含声明的方法的契约,如果它是由类实现的,则必须实现这些方法),ArrayList类完成ArrayList类中声明的迭代器()方法的一组语句,因此,需要以这种方式调用,而不是像调用传统类那样由构造函数调用(例如ArrayList)?我对此有点困惑,我希望有人能对此有所了解。谢谢大家!

接口类似于类,但不是构造新类,而是使用关键字implements实现接口。迭代器接口在许多Java标准类中实现

想象你有一个球厂。 它可以打出网球和篮球,这是你的课。但是当网球和篮球都被制成时,它们具有类似的特性,比如isRound()和bounce()等等。接口类似于将这些属性分组在一个名称下。因此田纳西球和篮球都实现了接口球


所以在实现iterable的List中,可以使用一个名为iterator的iterable方法,它可以遍历List的元素。Arraylist还通过继承列表获得iterable

Java引用类型包括类、接口和枚举(以及数组,但它们有点不同)。所有这些都是定义行为的代码片段,因此需要导入,以便您的程序知道其中有哪些方法可用,等等

因此,
Iterator
这样的接口有一段代码,说明在其中定义了哪些方法和常量,这些方法接受哪些参数,它们返回什么类型,等等。编译器必须知道所有这些,才能检查程序的正确性,并在它创建的字节码中生成对这些方法的正确调用

List
中的方法
iterator()。也就是说,来自实现
迭代器的类的对象。您不知道将是哪个类以及它是如何实现的—这些信息封装在特定列表的代码中—但您知道它实现了
Iterator
,因此在
Iterator
中声明了所有方法,并根据
Iterator
契约实现它们

因此,您可以将对实现接口
X
的任何对象的引用指定给类型为
X
的变量,即使它只是一个接口类型。该变量指向某个类中的实际对象,但程序只关心它实现了
X

Iterator n=numbers.Iterator();
确实如此。它表示“将
n
声明为接口类型
Iterator
的变量。向
numbers
列表询问其迭代器,并将其分配给
n
。因此您的“循环变量“实际上是
迭代器
对象。因为您知道它是
Iterator
类型-实现
Iterator
契约-您知道可以在它上使用
hasNext()
next()
。这就是在循环条件检查和下一行中所做的。

对于“迭代器n=numbers.Iterator()”我的意思是键入“迭代器n=numbers.Iterator()”以避免出现问题
Iterator<Integer> n = numbers.iterator();