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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Stephen_Chow 中级黑马   /  2013-11-2 11:12  /  1696 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Stephen_Chow 于 2013-11-2 22:52 编辑

在张孝祥的java提高视频里的一个疑问:(视频:24_张孝祥Java高新技术_数组与Object的关系及其反射类型)

  1. public class Test3 {
  2.         public static void main(String[] args) {
  3.                
  4. //                int i =1;
  5.                 Integer i =1;
  6.                 Object o =i;
  7.                 Object oo =5;//基本数据类型不是Object?但是这么传递没报错误呀
  8.                
  9.                 int[] a1 = new int[3];
  10.                 int[] a2 = new int[4];
  11.                 int[][] a3 = new int[2][3];
  12.                 String[] a4 = new String[3];
  13.                
  14.                 Object aObj1 = a1;
  15.                 Object aObj2 = a4;
复制代码
Object[] aObj3 = a1;MyEclipse有红叉:Type mismatch: cannot convert from int[] to Object[];


老师的解释是:基本数据类型不是Object,所以不能。String数组和int【】【】数组中的每个元素::String和int【】都是Object,所以能进行传递。


但是我自己写的Object 00 = 5;这句话没有报错误,可以通过,也就是说int可以装箱为Object,这么一来,对于int【】的每一个元素int,那不就能传递给Object了吗,所以:Object[] aObj3 = a1;这句话就应该行的呀。
基本数据类型不是Object?(不是说java中万物皆对象吗),那为什么能怎么写:Object 00 = 5; 既然能这么写,   Object[] aObj3 = a1;为什么通不过,数组与Object的关系很不好理解呀,谁有好的学习心得吗?
好苦恼,好混乱,头都大了,{:soso_e181:},师哥师姐你们在哪里?




评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 wangchao1686 于 2013-11-2 13:18 编辑

java数据类型图:
   搜索                              ┏数值型━┳━整数型:byte short int long
              ┏基本数据类型━━┫            ┗━浮点型:float double
              ┃                       ┣字符型:char                                          
数据类型╋                        ┗布尔型:boolean              
              ┃                            ┏类(class)
              ┗引用数据类型━━╋接口(interface)
                                             ┗数组(array)
java的数据类型分基本数据类型(原始数据类型)和引用数据类型;
1.基本八大类,图中可以很清楚的看到;这种类型的数据变量在声明之后java就会立刻分配给他内存空间。如:short a;  java会在可使用的内存空间寻找一个占两个字节的块给a变量;
2.引用数据类型就那三种

Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为基本类型包装类



基本数据类型      包装类
byte                       Byte
boolean                  Boolean
short                      Short
char                       Character
int                          Integer
long                        Long
float                       Float
double                    Double

其实,JDK自从1.5(5.0)版本以后,就引入了自动拆装箱的语法,也就是在进行基本数据类型和对应的包装类转换时,系统将自动进行,这将大大方便程序员的代码书写。

//int类型会自动转换为Integer类型

    int m = 12;

    Integer in = m;

    //Integer类型会自动转换为int类型

    int n = in;
所以在实际使用时的类型转换将变得很简单,系统将自动实现对应的转换

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
int[] a1 = new int[3];      
Object o1 = a1;//编译成功  语句1
Object [] o2=a1;//编译失败   语句2

从推理上将:语句1编译成功了,那么语句2肯定编译失败,因为一个变量不可能是一个数组类型,一个数组元素类型

原因:因为对于a1,因为是基本数据类型的数组,所以虚拟机会对其进行封装,把数组类型的对象封装成了一个对象,而不是一个数组的类型,
         又因为Object是所有类的父类,所以就可以使用o1接收封装成的对象,
         因为把a1封装成了一个对象,不是数组类型,那么使用数组类型接收当然会编译失败,类型不正确。

希望对你有帮助!

点评

感谢黑马骑士的回答!  发表于 2013-11-2 13:34
回复 使用道具 举报
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
万物皆对象是属于宣传语性质的,认真你就输了
基本类型不是对象,对象是指Object及其子类
因为Java的底层是用C语言写的,基本类型大多是直接从底层沿用过来的,有的会加上一点改动,
所有认真来说的话,Object类本身还是由它们构成的,这个不是继承,而是相当于物质由原子构成这么个意思
至于你的例子
Object obj = 10;这个是因为1.5加入的自动拆装箱,楼上的已经说了,实际相当于 Object obj = new Integer(10);
Object[] obj = new int[3];这个不行是因为int[]已经是对象了,要是把int[]改变成Integer[]这个是属于从一个对象变成了另一个对象,属于狗拿耗子行为

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
杨增坤 发表于 2013-11-2 13:15
int[] a1 = new int[3];      
Object o1 = a1;//编译成功  语句1
Object [] o2=a1;//编译失败   语句2

讲的很明白,十分感谢,多谢了
回复 使用道具 举报
零下五度的水 发表于 2013-11-2 13:56
万物皆对象是属于宣传语性质的,认真你就输了
基本类型不是对象,对象是指Object及其子类
因为Java的底层是 ...

基本数据类型数组就是一个对象。讲的很有道理,很感谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马