老贴地址:http://topic.csdn.net/t/20050816/19/4212545.html
for each循环的一个奇怪现象!楼主ankyhe()2005-08-16 19:25:58 在 Java / J2SE / 基础类 提问
看下面这段代码:
class Employee{
}
class Manager extends Employee{
}
public class InheritanceTest {
public static void main(String[] args) {
Manager[] ms = new Manager[10];
Employee[] es = ms;
for(int i = 0 ; i < es.length; ++i)
es[i] = new Employee();
}
}
这样可以编译,但是在运行时会有一个ArrayStoreException异常。
但是如果将代码改为
class Employee{
}
class Manager extends Employee{
}
public class InheritanceTest {
public static void main(String[] args) {
Manager[] ms = new Manager[10];
Employee[] es = ms;
for(Employee elem:ms)
elem = new Employee();
}
}
可以顺利通过编译运行,一点异常都没有。
请问这两种写法有什么不同吗,为什么结论不一样?
问题点数:20、回复次数:4
1 楼kingfish(工作很忙,很少来csdn...)回复于 2005-08-16 19:37:17 得分 0 第一种由于向Manager数组中写入Employee,所以报错
第二种根本就不会存入到数组,所以没报错
2 楼ankyhe()回复于 2005-08-16 20:02:13 得分 0 这两种写法不是一样的意思嘛,kingfish能不能解释的清楚些?
3 楼kingfish(工作很忙,很少来csdn...)回复于 2005-08-16 20:15:34 得分 20你可以把for each后数组内容打出来看看,应该都是null
第二种大致相当与:
Employee elem = null;
for (int i = 0; i < ms.length; ++i) {
elem = ms[i];
elem = new Employee();
}
4 楼ankyhe()回复于 2005-08-16 20:26:36 得分 0 明白了,谢谢啊!个人意见:造成这个问题的主要原因就是:没有显示地初始化Manager[] 数组!~ 等待高手详解!~~
for each循环的一个奇怪现象!楼主ankyhe()2005-08-16 19:25:58 在 Java / J2SE / 基础类 提问
看下面这段代码:
class Employee{
}
class Manager extends Employee{
}
public class InheritanceTest {
public static void main(String[] args) {
Manager[] ms = new Manager[10];
Employee[] es = ms;
for(int i = 0 ; i < es.length; ++i)
es[i] = new Employee();
}
}
这样可以编译,但是在运行时会有一个ArrayStoreException异常。
但是如果将代码改为
class Employee{
}
class Manager extends Employee{
}
public class InheritanceTest {
public static void main(String[] args) {
Manager[] ms = new Manager[10];
Employee[] es = ms;
for(Employee elem:ms)
elem = new Employee();
}
}
可以顺利通过编译运行,一点异常都没有。
请问这两种写法有什么不同吗,为什么结论不一样?
问题点数:20、回复次数:4
1 楼kingfish(工作很忙,很少来csdn...)回复于 2005-08-16 19:37:17 得分 0 第一种由于向Manager数组中写入Employee,所以报错
第二种根本就不会存入到数组,所以没报错
2 楼ankyhe()回复于 2005-08-16 20:02:13 得分 0 这两种写法不是一样的意思嘛,kingfish能不能解释的清楚些?
3 楼kingfish(工作很忙,很少来csdn...)回复于 2005-08-16 20:15:34 得分 20你可以把for each后数组内容打出来看看,应该都是null
第二种大致相当与:
Employee elem = null;
for (int i = 0; i < ms.length; ++i) {
elem = ms[i];
elem = new Employee();
}
4 楼ankyhe()回复于 2005-08-16 20:26:36 得分 0 明白了,谢谢啊!个人意见:造成这个问题的主要原因就是:没有显示地初始化Manager[] 数组!~ 等待高手详解!~~
解决方案 »
- <原创>用Java枚举类定义表,并且生成查询语句。
- 求教:Exception in thread "main" java.lang.StackOverflowError
- 在jdbc中调用oracle的存储过程的out参数的问题,急
- 未按鼠标 却执行鼠标mousePressed()事件
- 请教一个JDBC连接数据库中的URL设置的问题
- 大家新年好!问几个关于IO方面的问题,谢谢指教!
- 继续散分!心情好差!散完为止
- 用Swing画的界面(Java默认的显示风格)想变成Windows的风格可以吗?
- RMI启动问题
- 初始化和清理问题,求教大佬~
- hibernate基础配置问题(参考apress beginning Hibernate)
- 请问怎么在servlet里面写数据库insert代码?
第二种根本就不会存入到数组,所以没报错
后者:elem并非指向ms中的某个位置,而是一个普通的Employee类型的变量,自然可以放超类的Employee,其“本质”如下class Employee {
}class Manager extends Employee {
}class InheritanceTest {
public static void main(String[] args) {
Manager[] ms = new Manager[10];
Employee[] es = ms;
for (int i = 0; i < es.length; ++i) {
Employee elem = es[i];
elem = new Employee();
}
}
}晕,旧帖3楼回答得很清楚了……