A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马_许芸 中级黑马   /  2012-8-28 17:53  /  1862 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马_许芸 于 2012-8-28 18:02 编辑

  1. <p>下面这段代码,是我看“24_黑马程序员_张孝祥_Java基础加强_数组与Object的关系及其反射类型”这集视频做的笔记,其中我有两个问题不太懂,在代码中用红色标出。</p>
复制代码
package cn.itcast.day1;
import java.util.Arrays;
public class ReflectTest6
{
public static void main(String[] args)
{
  int[] a1 = new int[]{1,2,3};
  int[] a2 = new int[4];
  int[][] a3 = new int[2][3];
  String[] a4 = new String[]{"a","b","c"};
  
  System.out.println(a1.getClass() == a2.getClass());
//  System.out.println(a1.getClass() == a3.getClass());//为什么这两行代码,老师的可以编译通过,而我的通不过?
//  System.out.println(a1.getClass() == a4.getClass());

  System.out.println(a1.getClass().getName());
  
  //下面这两行打印出来的结果都是java.lang.Object,表明int[]和String[]都是Object的子类。
  System.out.println(a1.getClass().getSuperclass().getName());
  System.out.println(a4.getClass().getSuperclass().getName());
  
  Object aObj1 = a1;
  Object aObj2 = a4;
//  Object[] aObj3 = a1;  //编译通不过,因为这个数组里面装的不是Object(int)
  Object[] aObj4 = a3;  //有一个数组,数组里面装的是Object(int[])
  Object[] aObj5 = a4;  //有一个数组,数组里面装的是Object(String)
  
  //下面两行代码打印出来的结果是[[I@de6ced] [a, b, c]
  //这是因为asList方法要求传入的是Object[].而a1是一个int[],不能被转换成Object[]。
  //那为什么能够编译通过呢?在运行的时候,Arrays.asList(a1)这个方法又做了些什么呢?
  System.out.println(Arrays.asList(a1));
  System.out.println(Arrays.asList(a4));

}
}

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
对于第一个问题,我用的Eclipse同样编译不通过(不过张老师用的MyEclipse,不知道是不是这个问题),但是先得到它们的Class后再比较就没问题了
如 :Class c1 = a1.getClass();
         Class c2 = a2.getClass();
         Class c3 = a3.getClass();
         Class c4 = a4.getClass();
  
        System.out.println(c1 ==c2); // true
        System.out.println(c1 ==c3); // false
        System.out.println(c1 ==c4); // false


对于第二个问题,张老师也提到了,asList方法在 JDK1.4 -- asList(Object[] a) ,而 JDK1.5 -- asList(T... a)
           a1是基本数据类型的数组,可以看做是Object,按照JDK1.4的asList是无法实现的,而JDK1.5中对asList()的实现变成了泛型方式,
           所以将整个数组作为元素遍历了,得到的是其在内存中的地址

          a4是String[],可以看做是Object[],这正符合JDK1.4的语法规则,所以可以直接对其进行遍历

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
那两行代码我的可以通过,你看看提示什么错误。
基本类型的一维数组可以被当做Object类型使用,但不能当做Object【】类型使用;而非基本类型的一维数组既可以当做Object类型使用,又可以当做Object【】类型使用,所以a4当作String【】数组可以在asList()方法中正常返回。java5中,asList()里是可变参数,它把基本类型的数组当初Object类型使用,而Object类型又做为内部类型的数组的首个元素使用,所以才会打印[[I@35ce36],如果在用List的size()方法就可以看大List的长度为1.sun的官方解释是
Arrays.asList is now a vararg method, and the behavior is as intended:  asList(int[] ...)
The Java generics implementation does not support non-reference type parameters.
This is all standard Java 5.0 stuff.
而我们实际上也可以将它视为一个bug,因为它想解决的问题没得到完美解决。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马