新手自学java遇到的小问题(2),求高手解答。

时间:2022-03-20 07:12:37
看到了C和C++中没有的“foreach”语句,就实验了一下。

for (variable : collection) statement

结果无意中发现它的两个参数(第一个是数组中元素的类型,第二个是数组对象)中的第一个参数必须在括号中声明,
如果在外部声明,而括号中直接使用的话就会在第一个参数上报错:variable cannot be resolved to a type
并且在第二个参数上报错:Type mismatch: cannot convert from element type int to variable

这让我比较费解,for语句中的初始化、检查、更新参数都可以在语句外部声明,为什么这个很类似for语句的“foreach”语句不能这么定义,应该怎么理解这个语句呢?

11 个解决方案

#1


懂得啦你说的意思 但是我回答不上来 给你顶顶

#2


你的意思大概是

int[] a={3,4,5};
for(int i:a){
   System.out.println(i);
}

可以运行,但是

int[] a={3,4,5};
int i;
for(i:a){
   System.out.println(i);
}

不能运行吧。
---------
我感觉foreach语句只是java这样规定的而已,因为java中本来就提倡for(int i=0;;)这种写法,而不提倡
int i; for(i=0;;)这种写法,所以java中新定义了一种语法很可能就只让按照第一种写

#3


引用 2 楼  的回复:
你的意思大概是

Java code


int[] a={3,4,5};
for(int i:a){
   System.out.println(i);
}


可以运行,但是

Java code


int[] a={3,4,5};
int i;
for(i:a){
   System.out.println(i);
}


不能运行吧。
--……


您说的很有道理,可能是我想多了,其实就是像您说的这样的简单。

以您的思路继续往下想,我又想到:
for语句中之所以可以在语句之外声明变量,是因为可能在语句之外需要用到这个参数,比如运行到某一次循环时会跳出。
但在“foreach”语句中是必须要全部遍历过所有元素,而不存在中途跳出的问题,所以没有必要设计成可以在外部声明参数的设定。

这样就可以解释了,不知道我这样理解是否正确,还请高手指点。

#4


引用 3 楼  的回复:
引用 2 楼  的回复:
你的意思大概是

Java code


int[] a={3,4,5};
for(int i:a){
System.out.println(i);
}


可以运行,但是

Java code


int[] a={3,4,5};
int i;
for(i:a){
System.out.println(i);
}


不……

我觉得你说的很对, “foreach”语句中是必须要全部遍历过所有元素,而不存在中途跳出的问题我觉得你说的这个才是核心,我没有考虑到这个,受教了

#5


没有规定foreach一定要遍历所有的元素,中途一样可以break
至于能否用外部变量,这些属于语法限制,没有什么好纠结的

#6


引用 1 楼  的回复:
懂得啦你说的意思 但是我回答不上来 给你顶顶


多谢捧场,我也顶一个,明天见。

#7


引用 5 楼  的回复:
没有规定foreach一定要遍历所有的元素,中途一样可以break
至于能否用外部变量,这些属于语法限制,没有什么好纠结的


确实,中间可以随时中断,书中说的是可以遍历所有的元素,并不是必须。
我过于执着的想要找个理由用于理清他和for语句的关系,以及更好的解释for语句,想多了。

#8


foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组,执行完了后在把控制权交给地下的语句块,而for循环是先判断条件是否成立,然后在执行下面的语句块

#9


引用 8 楼  的回复:
foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组,执行完了后在把控制权交给地下的语句块,而for循环是先判断条件是否成立,然后在执行下面的语句块


1、您这里所说的“嵌入语句组”实现的功能是什么?

2、您说“foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组,执行完了后在把控制权交给地下的语句块”,我不太明白您说的是每个元素的每次循环是这样的操作流程,还是一开始就对所有元素执行嵌入语句组,之后才进行后面的语句?

#10


该回复于2012-06-17 11:19:24被版主删除

#11


顶了再顶

#1


懂得啦你说的意思 但是我回答不上来 给你顶顶

#2


你的意思大概是

int[] a={3,4,5};
for(int i:a){
   System.out.println(i);
}

可以运行,但是

int[] a={3,4,5};
int i;
for(i:a){
   System.out.println(i);
}

不能运行吧。
---------
我感觉foreach语句只是java这样规定的而已,因为java中本来就提倡for(int i=0;;)这种写法,而不提倡
int i; for(i=0;;)这种写法,所以java中新定义了一种语法很可能就只让按照第一种写

#3


引用 2 楼  的回复:
你的意思大概是

Java code


int[] a={3,4,5};
for(int i:a){
   System.out.println(i);
}


可以运行,但是

Java code


int[] a={3,4,5};
int i;
for(i:a){
   System.out.println(i);
}


不能运行吧。
--……


您说的很有道理,可能是我想多了,其实就是像您说的这样的简单。

以您的思路继续往下想,我又想到:
for语句中之所以可以在语句之外声明变量,是因为可能在语句之外需要用到这个参数,比如运行到某一次循环时会跳出。
但在“foreach”语句中是必须要全部遍历过所有元素,而不存在中途跳出的问题,所以没有必要设计成可以在外部声明参数的设定。

这样就可以解释了,不知道我这样理解是否正确,还请高手指点。

#4


引用 3 楼  的回复:
引用 2 楼  的回复:
你的意思大概是

Java code


int[] a={3,4,5};
for(int i:a){
System.out.println(i);
}


可以运行,但是

Java code


int[] a={3,4,5};
int i;
for(i:a){
System.out.println(i);
}


不……

我觉得你说的很对, “foreach”语句中是必须要全部遍历过所有元素,而不存在中途跳出的问题我觉得你说的这个才是核心,我没有考虑到这个,受教了

#5


没有规定foreach一定要遍历所有的元素,中途一样可以break
至于能否用外部变量,这些属于语法限制,没有什么好纠结的

#6


引用 1 楼  的回复:
懂得啦你说的意思 但是我回答不上来 给你顶顶


多谢捧场,我也顶一个,明天见。

#7


引用 5 楼  的回复:
没有规定foreach一定要遍历所有的元素,中途一样可以break
至于能否用外部变量,这些属于语法限制,没有什么好纠结的


确实,中间可以随时中断,书中说的是可以遍历所有的元素,并不是必须。
我过于执着的想要找个理由用于理清他和for语句的关系,以及更好的解释for语句,想多了。

#8


foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组,执行完了后在把控制权交给地下的语句块,而for循环是先判断条件是否成立,然后在执行下面的语句块

#9


引用 8 楼  的回复:
foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组,执行完了后在把控制权交给地下的语句块,而for循环是先判断条件是否成立,然后在执行下面的语句块


1、您这里所说的“嵌入语句组”实现的功能是什么?

2、您说“foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组,执行完了后在把控制权交给地下的语句块”,我不太明白您说的是每个元素的每次循环是这样的操作流程,还是一开始就对所有元素执行嵌入语句组,之后才进行后面的语句?

#10


该回复于2012-06-17 11:19:24被版主删除

#11


顶了再顶