营收|藏在Java数组的背后,你可能忽略的知识点( 三 )
arr.toString();
从上面的代码来看 , 在数组arr上 ,可以访问它的属性 , 也可以调用一些方法 。 这基本上可以认定 , Java中的数组也是对象 , 它具有java中其他对象的一些基本特点:封装了一些数据 , 可以访问属性 , 也可以调用方法 。 所以答案是肯定的 , 数组是对象 。
同时权威的Java Language Specification是这么说的:
In the Java programming languagearraysare objects (§4.3.1) are dynamically created and may be assigned to variables of type Object (§4.3.2). All methods of class Object may be invoked on an array.这里我就不给大家翻译了 , 看不懂的有道翻译一下
补充:Java Language Specification里关于Array还有这么一段:
Every array has an associated Class object shared with all other arrays with the same component type. [ This数组对象不是从某个类实例化来的 , 而是由JVM直接创建的 。 实际上也没有Array这个类(有是有 , 但只是
acts as if: the direct superclass of an array type is Object [ and
every array type implements the interfaces Cloneable and java. io. Serializable.
java.lang.reflect
包里的一个反射类) 。 但每个数组都对应一个Class对象 。 通过RTTI(Run-Time Type Information)可以直接检查Array
的运行时类型 , 以及它的签名 , 它的基类 , 还有其他很多事 。 在C++中 , 数组虽然封装了数据 , 但数组名只是一个指针 , 指向数组中的首个元素 , 既没有属性 , 也没有方法可以调用 。 如下代码所示:int main(){\tint a[
= {1 2 3 4;\tint* pa = a;\t//无法访问属性 , 也不能调用方法 。
\treturn 0;
所以C++中的数组不是对象 , 只是一个数据的集合 , 而不能当做对象来使用 。
Java中数组的类型Java是一种强类型的语言 。 既然是对象 ,那么就必须属于一个类型 , 比如根据Person类创建一个对象 , 这个对象的类型就是Person 。 那么数组的类型是什么呢?看下面的代码:
int[
arrI = {1 2 3 4;
System.out.println(arrI.getClass().getName());
String[
arrS = new String[2
;
System.out.println(arrS.getClass().getName());
String[
[
arrsS = new String[2
[3
;
System.out.println(arrsS.getClass().getName());
OutPut:
[I
[Ljava.lang.String;
[[Ljava.lang.String;
arrI
的类型为[ I
, arrS
的类型是[Ljava.lang.String;
arrsS
的类型是[[Ljava.lang.String
;所以 , 数组也是有类型的 。 只是这个类型显得比较奇怪 。 你可以说
arrI
的类型是int[
, 这也无可厚非 。 但是我们没有自己创建这个类 , 也没有在Java
的标准库中找到这个类 。 也就是说不管是我们自己的代码 , 还是在JDK
中 , 都没有如下定义:public class int[
{\t
\t// ...
这只能有一个解释 , 那就是这个数组对象并不是从某个类实例化来的 , 而是由JVM直接创建的 , 同时这个直接创建的对象的父类就是Object , 所以可以调用Object中的所有方法 , 包括你用到的toString() 。
我们可以把数组类型和8种基本数据类型一样 ,当做Java的内建类型 , 这种类型的命名规则是这样的:
每一维度用一个[表示;开头两个[ , 就代表是二维数组 。
[后面是数组中元素的类型(包括基本数据类型和引用数据类型)
推荐阅读
- Java|淘宝商家要小心了!取消的“中差评”体系又回来啦!
- 少年帮|不畏惧微信、支付宝,一年营收30000亿!中国最另类支付巨头
- javascript|游戏开发之旅-JavaScript重新介绍
- Java|java多线程并发小demo
- Java|java程序猿如何才能走远,怎么做自己的职业规划
- 趣味科技秀|华为“功不可没”,超120亿美元营收!台积电传来好消息
- 营收|深圳公司实力大比拼:世界500强企业有八家,华为在当地排老二
- 蚂蚁花呗|血亏!阿里P8轻易把总结了近一年的java高级特性笔记送人了
- 百度|Java高级进阶多线程学习之路(七)ThreadLocal
- 科创板日报|40 亿欧元 交付 10 台 EUV 设备 最新规格拟明年中期发货,ASML:三季度营收