数组变量 VS 数组对象

先看一例子:

int[] primitiveArray; //在栈中声明了一个引用变量,暂时还没指向任何对象

primitiveArray = new int[5]; //在堆中创建了一个数组对象,并将这个对象的引用复制给primitiveArray。这个数组对象中的每个数组元素的类型都是int类型,并且此时每个数组元素的值都为0。//------------------分割线---------------

int[] primitiveArray2 = {2,3,4,5,6};//在栈中声明了一个名为primitiveArray2 的引用变量,同时在堆中创建了一个数组对象,primitiveArray2指向该对象。该数组对象的各个数组元素的值分别为2,3,4,5,6

数组变量(数组名、数组标识符):分配在栈空间,引用类型,比如上例中的primitiveArray和primitiveArray2,指向在堆中创建的一个真实对象(数组对象)。

数组对象:分配在堆空间,是一个对象,由一系列固定数量的数组元素(element)组成,数组元素的个数在创建数组对象时确定。每个数组元素可以存放基本数据类型的值,或者是指向其他类型的引用,这取决于数组类型。

对象数组 VS 基本类型数组

上述例子中创建的是基本基本类型的数组,也可以创建对象数组,比如:

Student[] objectArray; //在栈中声明了一个引用变量,暂时还没指向任何对象

objectArray= new Student[5]; //在堆中创建了一个数组对象,并将这个对象的引用赋值给objectArray。这个数组对象中的每个数组元素的类型都是Student类型(引用类型),并且此时每个数组元素的值都为null。//------------------分割线---------------

Student[] objectArray2= {new Student("zhangsan"),new Student("lisi"),new Student("wangwu")};//在栈中声明了一个名为objectArray2的引用变量,同时在堆中创建了一个数组对象,objectArray2指向该对象。另外还在堆中创建了三个Student对象,该数组对象中的三个数组元素分别指向了这三个Student对象。

1.在使用上几乎是相同的;

2.唯一的区别就是对象数组保存的是引用,基本类型数组直接保存基本类型的值。

数组类型是一种引用类型

比如int是一个基本类型,但是int[]就是一种引用类型了。为什么这么说呢?

因为int a = 32;

变量a在栈空间,其存储的值为32;

而int[] b = {32};

变量b在栈空间,其存储的值是堆空间中的某个地址值了。既然b中存储的是地址,那么b就是引用类型的变量了。

什么是Java中的对象呢?

在java中如何创建一个对象呢?一般是new Class,这样就会在堆空间中创建出一个对象了。那么Java数组是一个对象吗?如果是对象,那它是哪个类的实例呢?

事实上,java中数组也是一个对象。因为java数组存在于堆空间,所以它就是一个对象,既然它是一个对象,那么它是哪个类的实例呢?

Student student = newStudent();

System.out.println(student.getClass().getCanonicalName());//输出结果:Student

Student[] objectArray= new Student[5];

System.out.println(objectArray.getClass().getCanonicalName());//输出结果:Student[]

Student[][] objectArray2= new Student[5][];

System.out.println(objectArray2.getClass().getCanonicalName());//输出结果:Student[][]

Student[][][] objectArray3= new Student[5][][];

System.out.println(objectArray3.getClass().getCanonicalName());//输出结果:Student[][][]

所以,数组类型可以看做一个特殊的Class类。

ClassName reference = new ClassName(); //普通类的使用方式,这里这是创建了一个对象,栈空间中的引用指向该对象,对象中的各个域进行了默认的初始化,可能还需要重新设置值。

Type[] refrence = new Type[length]; //使数组的方式,创建了一个数组对象,栈空间中的引用指向该对象,数组对象中的各个数组元素进行了默认的初始化,还需要重新给各个元素复制。

所以有的书中,将java中的对象分为:(类的)实例对象和数组对象。

参考资料

Java数组参考_Java数组相关推荐

  1. java数组解析_Java - 数组解析

    一.什么是数组 数组?什么是数组?在我印象中的数组是应该这样的:通过new关键字创建并组装他们,通过使用整形索引值访问它的元素,并且它的尺寸是不可变的! 但是这只是数组的最表面的东西!深一点?就是这样 ...

  2. java合法的数组声明_Java数组详解

    Java数组详解 数组详解 1.数组概述 数组是相同类型数据的有序集合 每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们 2.数组声明和创建 ①数组声明形式 dataType[] a ...

  3. java 数组 反射_java数组的反射

    java数组的反射,有一个JAVA API类可以运用:java.lang.reflect.Array 具体应用: 1:判断一个对象是否是数组: int arr[] = {1,2,3}; Class c ...

  4. java 数组协变_java 数组协变

    标签: 在某些情况下,即使某个对象不是数组的基类型,我们也可以把它赋值给数组元素.这种属性叫做协变(covariance).在下面的情况下可以使用协变: 数组是引用类型数组. 在赋值的对象类型和数组基 ...

  5. java类型的数组初始化_java数组初始化详解

    介绍 学习Java的朋友想必对数组并不陌生,它需要使用之前对其进行初始化,这是因为数组是引用类型,声明数组只是声明一个引用类型的变量,并不是数组对象本身,只要让数组变量指向有效的数组对象,程序中就可使 ...

  6. java 数组成员_java 数组中含有

    <数据结构与抽象:Java语言描述(原书第4版)>一2.2.1 可变大小数组 本节书摘来华章计算机<数据结构与抽象:Java语言描述(原书第4版)>一书中的第2章 ,第2.2. ...

  7. java定义数组范围_Java数组的定义和使用

    为什么需要数组? 问题:我们要计算30个学生的平均分 如果没有数组,我们的代码是这样的 int score1 = 32; int score2 = 56; int score3 = 78; //--此 ...

  8. java 定义数组属性_Java数组的定义与使用

    一.数组概念 可以将多个同一数据类型的数据,存储到同一个容器中 1. 格式 数据类型[] 数组名=new 数据类型[元素个数] "数据类型"表示该数组中可以存放哪一类型的数据 &q ...

  9. java 二维数组倒置_Java数组反转及二维数组

    数组的反转 反转就是把最远端的元素和最近端的元素位置互换(反转前数据:1,2,3,4,5,6反转后:6,5,4,3,2,1) //准备一个需要反转的数组 int[] arr = {1,2,3,4,5, ...

最新文章

  1. Python回顾与整理12:执行环境
  2. h2 java tcpip_windows下创建h2集群,及java集成详细步骤
  3. 查询计划中集的势(Cardinality)的计算
  4. Electron通过ffi调用DLL
  5. UIWindowLevel详解
  6. 使用Flexible实现H5页面的终端适配
  7. asp.net 2.0 + sqlserver2005 数据依赖缓存
  8. 编译原理 上下文无关文法
  9. 英语听力学习-VOA
  10. nodejs+vue结合七牛云实现图片上传
  11. 有备而来! 解密DEVELOP德凡为何进入中国市场?
  12. kbhit linux windows通用,_kbhit() for Linux
  13. 专家鼓励住房、汽车等大宗商品消费
  14. 数据仓库工程师基本技能
  15. TIA博途中OB86组织块的功能和使用方法
  16. Davinci数据可视化-新增图表类型-旭日图
  17. Android系统(168)---Android 开源项目分类汇总
  18. 【统计建模与R软件】第二章 R软件的使用 课本课后习题 答案 解析 代码
  19. HTML+CSS学习笔记(pink老师前端课程笔记--补档)
  20. c#12星座速配代码_程序员12星座性格分析,猜猜哪个星座最适合IT行业?

热门文章

  1. mysql索引底层图_MySQL索引底层数据结构
  2. sgu 175 Encoding
  3. 信号 应用场景 内置信号 内置信号操作 自定义信号
  4. WebSocket安卓客户端实现详解(一)–连接建立与重连
  5. 《DSP using MATLAB》示例Example7.20
  6. ubuntu学习命令
  7. IOS逆向【2】-cydia之开发者模式
  8. 深入了解一下PYTHON中关于SOCKETSERVER的模块-B
  9. 一个男人关心的东西决定他的层次(转)
  10. 关于HBITMAP,CBITMAP,BITMAP的转换以及图像显示的一点归纳