JAVA的foreach问题,求大神解答,感激不尽~~~~

咳咳,我先看的《疯狂java讲义》,有段话是这样的:
当使用foreach循环来迭代输出数组元素或集合元素时,通常不要对循环变量进行赋值,虽然这种赋值在语法上是允许的,但没有太大的实际意义,而且极容易引起错误。例如下面程序:
String[] books = {"轻量级J2EE企业应用实战" ,
"Struts2权威指南",
"基于J2EE的Ajax宝典"};
for (String book : books) {
book = "Ruby On Rails敏捷开发最佳实践";
System.out.println(book); }
System.out.println(books[0]); } }
运行上面程序,将看到如下运行结果:
Ruby On Rails敏捷开发最佳实践
Ruby On Rails敏捷开发最佳实践
Ruby On Rails敏捷开发最佳实践
轻量级J2EE企业应用实战
从上面运行结果来看,由于我们在foreach循环中对数组元素进行赋值,结果导致不能正确遍历数组元素,不能准确取出每个数组元素的值。而且当我们再次访问第一个数组元素时,发现数组元素的值依然没有改变。不难看出,当使用foreach来迭代访问数组元素时,foreach中的循环变量相当于一个临时变量,系统会把数组元素依次赋给这个临时变量,而这个临时变量并不是数组元素,它只是保存了数组元素的值。因此,如果希望改变数组元素的值,则不能使用这种foreach循环。
********************嗯嗯,foreach只能便遍历数组不能改数组啊,我记住了******************

但当我看《core java》时,作者在一个主函数的foreach中竟然调用了Employe对象的方法,

这个raiseSalary方法就是个普通的加工资函数。。。

按《疯狂java讲义》中说的,String book : books中,book与books数组的每一个元素都只是值的传递而没有内存关系,但《core java》中Employe e:staff,e居然调用了Employe的raiseSalary函数,而且似乎还改变了staff数组的元素的实例域的值,那e岂不是与staff数组的元素又有内存上的关系了???

自己实在是想不通了,求解惑~~~~~~
************************************************************************
好吧,不用答了我懂了。。。
一个方法可以改变一个对象参数的状态,
一个方法不能让对象参数引用一个新的对象。。。
翻译到foreach就是:
foreach中循环变量可以改变引类型数组元素的状态,
但不能使其引用一个新的对象。。。
************************************************************************
好吧,困惑了一晚上,在《core java》第102页发现的问题原来在117页就有详细的描述啊。。。。晕死。。。。
不过这书写的真不错`(*∩_∩*)′

枚举,很正常,这些是JAVA的基本语法。

至于改变值,因为里面的是“复杂对象”——自定义类,是会改变的。这一点,要留意。
温馨提示:内容为网友见解,仅供参考
无其他回答

JAVA的foreach问题,求大神解答,感激不尽~~~
枚举,很正常,这些是JAVA的基本语法。至于改变值,因为里面的是“复杂对象”——自定义类,是会改变的。这一点,要留意。

java开发工程师必须要学的技术有哪些?
1、Java 程序设计基础,包括 J2sdk基础、Java面向对象基础、Java API使用、数据结构及算法基础、Java AWT图形界面程序开发;2、J2SE平台Java程序设计,包括Swing图形程序设计, Socket网络应用程序设计,对象序列化,Java 常用数据结构,Applet,流和文件,多线程程序设计;3、Java Web应用编程,包括 Java Oracl...

用perl查一个词表中的词在另一个文档中出现的,频率,输出频率表,并列出...
foreach my $word (sort keys %Words) { print "单词“$word”共出现$Words{$word}{'count'}次,";print "包含单词“$word”的行如下:\\n";foreach (keys $Words{$word}) { next if ($_ eq 'count');print "$_\\n";} } print "succeed!\\n";...

求用C#编辑一个猜数字游戏。要求是自己想个数(1000-9999之间),电脑猜...
bool oo = true;int num = 0;\/\/比较了多少次 string str = "123";Random r = new Random();string str1 = r.Next(1000, 9999).ToString();while (oo){ num += 1;int rightCount = 0;\/\/对了几个 if(str.equals(str1)){rightCount =str.length;oo=false;continue;} foreach (...

php如何把id相同的累计求和
=> 200],['id' => 2, 'value' => 200],['id' => 1, 'value' => 200],['id' => 2, 'value' => 200],['id' => 2, 'value' => 200],['id' => 2, 'value' => 200],];$result = [];foreach($ary as $key => $vo) {if (!array_key_exists($vo[...

Java实现学生简易信息管理系统
import java.util.*;import java.io.*;class StuMgr{public static class Student{public int id;public String name;public int age;public Student(int id ,String name,int age){this.id = id;this.name = name;this.age = age;}@Overridepublic String toString(){return id + "," + ...

Microsoft OLE DB Provider for SQL Server 错误 '80004005'
janetl 登录不能访问 Northwind 数据库,除非允许 guest 登录。尽管 janetl 登录已经删除,它仍然(作为一个孤立行)显示在 sysusers 表中:USE Northwind SELECT FROM sysusers WHERE name = 'janetl'解决孤立用户问题 用 sp_addlogin 添加一个临时登录。为孤立...

相似回答