JavaSE--for each
参考:http://blog.csdn.net/yasi_xi/article/details/25482173
学习多线程的时候实例化线程数组而挖掘出来的一直以来的理解误区
之前一直以为for each 本质上和for循环以及迭代器没什么区别
package foreach; public class ForeachDemo1 { public static void main(String[] args) {
Object[] objs = new Test[5];
int i = 0;
//for each的简洁使得我喜欢这种使用方式
for(Object obj : objs) {
obj = new Test(i + "");
System.out.println(objs[i++]);//
}
System.out.println(objs[2]);//
} } class Test { private String value; public Test(String value) {
this.value = value;
} public String getValue() {
return value;
} public void setValue(String value) {
this.value = value;
} @Override
public String toString() {
return "Test [value=" + value + "]";
} }
打印的结果使得我很是懵逼
后来查了下资料才知道for each内部的大概实现方式
有趣的是,这个砸到我头的苹果是这样的..
package foreach; public class Apple1 { public static void main(String[] args) {
Thread[] t1 = new T1[3];
Thread[] t2 = new T2[2]; for(Thread t : t1) {
t = new T2();//大概就是这样,原代码是生产者消费者交替打印而产生的线程无限等待
//然而这样做并没毛病
//-->等价于
//Thread t = t1[0]
//t = new T2()
//t.start()
//这当然没问题了
t.start();
} t1[0] = new T2();
//但是这样的话 就抛异常了【当你试图将错误类型的对象存储到一个对象数组时抛出的异常】
//声明的空间和实际new的类型不一致
} } class T1 extends Thread { //... @Override
public void run() {
// TODO Auto-generated method stub
} } class T2 extends Thread { //.. @Override
public void run() {
// TODO Auto-generated method stub
} }
验证:
package foreach; public class Demo2 { public static void main(String[] args) {
String[] strs = new String[3]; for(String s : strs) {
s = "1";
} System.out.println(strs[0]);
} }
JavaSE--for each的更多相关文章
- 用大白话聊聊JavaSE -- 如何理解Java Bean(一)
首先,在开始本章之前,先说一个总的概念:所谓的Java Bean,就是一个java类,编译后成为了一个后缀名是 .class的文件.这就是Java Bean,很多初学者,包括当年的我自己,总是被这些专 ...
- javaSE基础07
javaSE基础07 一.static静态修饰符 用了static修饰的变量就会变成共享的属性,只会初始化一次,在内存中只存在一个,并且每个对象都可以访问,存放在方法区(数据共享区) 1.1 stat ...
- javaSE基础06
javaSE基础06 一.匿名对象 没有名字的对象,叫做匿名对象. 1.2匿名对象的使用注意点: 1.我们一般不会用匿名对象给属性赋值的,无法获取属性值(现阶段只能设置和拿到一个属性值.只能调用一次方 ...
- javaSE基础05
javaSE基础05:面向对象 一.数组 数组的内存管理 : 一块连续的空间来存储元素. Int [ ] arr = new int[ ]; 创建一个int类型的数组,arr只是一个变量,只是数组的一 ...
- javaSE基础04
javaSE基础04 一.三木运算符 <表达式1> ? <表达式2> : <表达式3> "?"运算符的含义是: 先求表达式1的值, 如果为真, ...
- javaSE基础03
javaSE基础03 生活中常见的进制:十进制(0-9).星期(七进制(0-6)).时间(十二进制(0-11)).二十四进制(0-23) 进制之间的转换: 十进制转为二进制: 将十进制除以2,直到商为 ...
- 用大白话聊聊JavaSE -- 自定义注解入门
注解在JavaSE中算是比较高级的一种用法了,为什么要学习注解,我想大概有以下几个原因: 1. 可以更深层次地学习Java,理解Java的思想. 2. 有了注解的基础,能够方便阅读各种框架的源码,比如 ...
- javaSE基础02
javaSE基础02 一.javac命令和java命令做什么事情? javac:负责编译,当执行javac时,会启动java的编译程序,对指定扩展名的.java文件进行编译,生成了jvm可以识别的字节 ...
- JavaSE基础01
JavaSE基础篇01 ------从今天开始,我就学习正式java了,O(∩_∩)O哈哈~,请大家多指教哦 一.Windows常见的dos命令 操作dos命令: win7 --->开始 --- ...
- javaSE学习路线
Java SE大致可分为以下几块内容: n 对象导论:如何用面向对象的思路来开发 n 深入JVM:Java运行机制以及JVM原理 n 面向对象的特征:封装.继承.抽象.多态 n 数组和容器:容 ...
随机推荐
- springboot - 返回xml error 从自定义的 ErrorController
1.概览 2.在<springboot - 返回JSON error 从自定义的 ErrorController>基础上,做如下调整: 1).新增Attribute类和Error类 pac ...
- SQL server 注入 和 SQL server 扩展(10.29 第二十九天)
Step1:检测注入点 Step2: select * from sysobjects (sysobjects 系统对象表,保存当前数据库的对象) select * from users wher ...
- SpringBoot#自定义配置的封装
_震惊,开局 不可避免的需要弄一些自定义的配置. 要点: 1. 把配置项都写出来,分析层次关系:2. 抽象成bean与bean之间的关系,写出bean对应的类,这时候配置项对应了bean的属性,属性可 ...
- maven-本地安装jar包
maven 安装本地jar包,通过install插件的install-file mojo进行工作,具体可通过如下命令进行查看 mvn help:describe -Dplugin=install -D ...
- Mysql 事务隔离级别分析
Mysql默认事务隔离级别是:REPEATABLE-READ --查询当前会话事务隔离级别mysql> select @@tx_isolation; +-----------------+ | ...
- C#的listview
listView1.Items.Clear(); ListViewItem listitem = new ListViewItem(字符串);//这是第一列的内容,需要,而且必须通过构造方法添加 ; ...
- 16 协程和www
1.一个应用程序一般对应一个进程,一个进程一般有一个主线程,还有若干个辅助线程,线程之间是平行运行的,在线程里面可以开启协程,让程序在特定的时间内运行.2协程和线程的区别是:协程避免了无意义的调度,由 ...
- Java中的super关键字和this关键字作用介绍
一.super关键字的作用 1.子类在构造方法中显示调用父类构造方法 super可以在子类的构造方法中显示调用父类的构造方法:并且这行代码必须出现在子类构造方法的第一行.原因:因为父类构造方法没有执行 ...
- 【golang】golang文本处理
golang文本字符串操作:包含 合并 连接 分割 取索引 前缀后缀检测 消除字符串 消除空格 golang字符串操作需要用到 strings这个包 str := "hello world& ...
- mongodb replication set 主从切换
今天被问到mongodb副本集主从切换的问题,然后发现没有相关命令的中文文档,这里翻译记录一下 rs.stepDown() rs.stepDown(stepDownSecs, secondaryCat ...