我正在学习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
}
}
在下一课中,讲师将展示如何创建for-each循环的替代/模拟器。它的工作原理如下:
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文档后,&#34; Iterator&#34;被列为接口。这仍然与导入类相同吗?例如,在Java文档中,&#34; java.util.Scanner&#34;被认为是一个类,而不是一个接口。
问题2 :在提出问题之前,循环不需要&#34; ++ i&#34;实现的控件类型,因为Iterator的hasNext()方法检查是否有另一个要检查的元素。如果没有,那就停止。它是一个布尔值。然而,循环的开始,循环控制变量(LCV)是&#34; Iterator<Integer> n = numbers.iterator();
&#34;我不太明白这是什么意思。在我看来,我看到了Iterator类的一个对象?被设置为等于ArrayList iterator()方法。可能是因为#34; java.util.Interator;&#34;被认为是一个接口(基本上是一个声明了必须在类实现时实现的方法的契约),ArrayList类完成了ArrayList类中声明的iterator()方法的语句集,因此需要因为传统的类被调用(例如,ArrayList),而不是由构造函数调用?我对此感到有些困惑,我希望有人能够对此有所了解。谢谢!
答案 0 :(得分: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 :(得分:1)
接口类似于类,但不是构造新类,而是使用关键字implements实现接口。迭代器接口在许多Java标准类中实现。
想象一下,你有一个球厂。 它可以抽出网球和篮球,这是你的课程。但是当网球和篮球都被制造出来时,它们具有类似的属性,例如isRound()和bounce()等等。界面就像在名称下将这些属性组合在一起。所以网球和篮球都实现了Ball的界面。
因此,在实现iterable的List中,您可以使用名为iterator的可迭代方法,该方法可以遍历列表的元素。 Arraylist也可以通过继承List进行迭代。