JavaSE--for each

参考:http://blog.csdn.net/yasi_xi/article/details/25482173

学习多线程的时候实例化线程数组而挖掘出来的一直以来的理解误区

之前一直以为for each 本质上和for循环以及迭代器没什么区别

 1 package foreach;
 2
 3 public class ForeachDemo1 {
 4
 5     public static void main(String[] args) {
 6         Object[] objs = new Test[5];
 7         int i = 0;
 8         //for each的简洁使得我喜欢这种使用方式
 9         for(Object obj : objs) {
10             obj = new Test(i + "");
11             System.out.println(objs[i++]);//2
12         }
13         System.out.println(objs[2]);//1
14     }
15
16 }
17
18 class Test {
19
20     private String value;
21
22     public Test(String value) {
23         this.value = value;
24     }
25
26     public String getValue() {
27         return value;
28     }
29
30     public void setValue(String value) {
31         this.value = value;
32     }
33
34     @Override
35     public String toString() {
36         return "Test [value=" + value + "]";
37     }
38
39
40
41 }

打印的结果使得我很是懵逼

后来查了下资料才知道for each内部的大概实现方式

有趣的是,这个砸到我头的苹果是这样的..

 1 package foreach;
 2
 3 public class Apple1 {
 4
 5     public static void main(String[] args) {
 6         Thread[] t1 = new T1[3];
 7         Thread[] t2 = new T2[2];
 8
 9         for(Thread t : t1) {
10             t = new T2();//大概就是这样,原代码是生产者消费者交替打印而产生的线程无限等待
11                         //然而这样做并没毛病
12             //-->等价于
13             //Thread t = t1[0]
14             //t = new T2()
15             //t.start()
16             //这当然没问题了
17             t.start();
18         }
19
20         t1[0] = new T2();
21         //但是这样的话 就抛异常了【当你试图将错误类型的对象存储到一个对象数组时抛出的异常】
22         //声明的空间和实际new的类型不一致
23     }
24
25 }
26
27 class T1 extends Thread {
28
29     //...
30
31     @Override
32     public void run() {
33         // TODO Auto-generated method stub
34     }
35
36 }
37
38 class T2 extends Thread {
39
40     //..
41
42     @Override
43     public void run() {
44         // TODO Auto-generated method stub
45     }
46
47 }

验证:

 1 package foreach;
 2
 3 public class Demo2 {
 4
 5     public static void main(String[] args) {
 6         String[] strs = new String[3];
 7
 8         for(String s : strs) {
 9             s = "1";
10         }
11
12         System.out.println(strs[0]);
13     }
14
15 }

时间: 2024-10-12 16:53:02

JavaSE--for each的相关文章

JavaSE入门学习21:Java面向对象之接口(interface)(二)

一接口实现的多态 在上一篇博文:JavaSE入门学习20:Java面向对象之接口(interface)(一)中提到了接口的实现存在多态性,那么 这一篇主要就要分析接口实现的多态. 实例一 Test.java源文件代码: public class Test{ public static void main(String[] args){ //实现接口Singer Singer s1 = new Student("Amy"); s1.sing(); s1.sleep(); s1.study

JavaSE基础之JDBC

JavaSE基础之JDBC 1.JDBC 的步骤: ①加载数据库驱动: a.MySQL:com.mysql.jdbc.Driver: b.SQLServer:com.microsoft.jdbc.sqlserver.SQLServerDriver: c.Oracle:oracle.jdbc.driver.OracleDriver: ②获取数据库链接:  a.MySQL:jdbc:mysql://localhost:3306/DataBaseName: b.SQLServer:jdbc:sqlse

JavaSE入门学习24:Java面向对象补充

一Java中的Object类 Object类是所有Java类的父类,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认 继承Object类. public class Person{ // } //等价于 public class Person extends Object{ // } Object类中的方法,适合所有子类. 1)toString()方法 在Object类中定义有public String toString()方法,其返回值是String类型,描述当前对

JavaSE入门学习23:Java面向对象之构造方法

学了JavaSE面向对象这一部分,也该对构造方法做一个总结了. 一构造方法 在多数情况下,初始化一个对象的最终步骤是去调用这个对象的构造方法.构造方法负责对象的初始化工作,为 实例变量赋予合适的初始值.构造方法必须满足以下语法规则: (1)方法名必须与类名相同: (2)不要声明返回类型: (3)不能被static.final.synchronized.abstract和native修饰.构造方法不能被子类继承,所以用final和abstract 修饰没有意义.构造方法用于初始化一个新建的对象,所

【JavaSE】day11_Reader和Writer_PrintWriter_BufferedReader

[JavaSE]day11_Reader和Writer_PrintWriter 1.Reader和Writer 1)Writer,Reader 字符输出,输入流的父类. * 字符流特点:以字符为单位读写数据. * 字符流只能读写文本数据.所以不要用字符流读取非文本文件. * 字符流只是简化了我们对于字符串的读写操作不用自行在字节与字符之间转换. * 所以字符流都是高级流,底层本质还是要用字节读写数据. 2)OutputStreamWriter 按照给定的字符集,将字符串转换为一组字节后写出. 代

【史上最强JavaSE笔记】之数组篇

各位程序猿,各位攻城狮,各位蜥蜴鸥以及各位棕鲸鲤们~~大家好,我是潘师傅,欢迎大家收看由我为你们带来的[史上最强JavaSE笔记]系列,其实也可以叫[嘻哈JavaSE笔记]的,第一次在博客园发帖,想想还真是有点小激动呢,各位求支持呀,哈哈,那么回归正题,我把自己之前学习积累的笔记拿出来跟大家分享一下,方便大家更好的理解和复习,希望能够对大家有所帮助哈,这次发的是JavaSE方面数组篇的,内容不一定全面哦,欢迎大家前来留言交流哈,不足的地方还望大家多多指出和指导哈~(由于首次发文章,布局可能比较乱

java-se基础 2(注释和原生数据类型)

Java SE 第二讲: 1. Windows: notepad, editplus, ultraedit, gvim Linux: vi, vim, gedit 2. Java中的数据类型分为两大类: 1) 原生数据类型 (Primitive Data Type) 2) 引用类型(对象类型) (Reference Type) 3. 变量与常量:所谓常量,就是值不会变化的量:所谓变量,就是值可以变化的量. 4. 如何定义变量? 变量类型 变量名; int a; 5. 如何为变量赋值? 变量名 =

JavaSE 文件递归之删除&获取文件夹文件夹中全部的以.jpg的文件的绝对路径

1.递归删除文件 假设一个文件夹以下还有子文件夹,进行删除的话会 报错,这个时候要使用递归的方式来删除这个文件文件夹中的全部文件以及文件夹 package cn.itcast.digui; import java.io.File; /** * 递归删除demo目录中全部文件包含目录 * 分析: * A:封装目录 * B:获取改目录下的全部文件或者目录 * C:遍历改file数组,得到每个File对象 * D:推断该file对象是都是目录 * 是:回到B * 否:删除 * @author Admi

javase基础

目录 目录... 1 第一天... 5 1:计算机概述(了解) 5 2:键盘功能键的认识和快捷键(掌握) 5 3:常见的DOS命令(掌握) 6 4:Java语言概述(了解) 6 5:JDK,JRE,JVM的作用及关系(掌握) 7 6:JDK的下载,安装,卸载(掌握) 7 7:第一个程序:HelloWorld案例(掌握) 7 8:常见的问题(掌握) 8 9:path环境变量(掌握) 8 10:classpath环境变量(理解) 8 第二天... 10 1:关键字(掌握) 10 2:标识符(掌握)

JavaSE注释

注解在JavaSE中算是比较高级的一种用法了,为什么要学习注解,我想大概有以下几个原因: 1. 可以更深层次地学习Java,理解Java的思想. 2. 有了注解的基础,能够方便阅读各种框架的源码,比如hibernate,SpringMVC等等.里面就用到了大量的注解.即便无法阅读源码,以后使用这些框架,会有一种心理上的安全感. 3. 方便今后跟别人吹牛.(当然,这也很重要.) 好了,话不多说,我们开始吧. 1. 从注释的角度来理解注解 我想了很久,最终决定以这个小标题作为第一节的标题,我们在编写