当前位置:首页 » 编程语言 » java数组是对象

java数组是对象

发布时间: 2022-10-28 09:09:26

java 数组也算一个类吗

不管在其他语言中是什么,数组在Java中可得看作一个对象,它有一些值得探讨的特性。

Java中的数组其实是一个对象,但是确实是一个特殊的对象,实在是太特殊了,以致我们都不好把它多做对象处理。

java是纯面向对象的语言,数组也是一个对象。

首先我们看一下表面现象,数组创建的时候采用的是如下语句:
MyClass[] arr = new MyClass[9];

而普通类采用的是如下语句:
MyClass obj = new MyClass();

就是说,创建数组的时候不使用小括号传参。使得数组和普通类看起来就有很多不同,因为小括号里的参数是传递给构造方法的,进而让人感觉数组类是没有构造方法的。

2)java中数组是对象的依据:

数组的父类是Object,
new Object[0].getClass().getSuperClass() 是Object.class

数组没有对应的类文件,String对应String.class.数组却没有,而且他们的 类名字很古怪,可以这样获得 new int[2].getClass().getName();
这是和其他对象最大的不同点,因为数组类是在运行时生成的。

java.lang.reflect.Array是final的,所以数组肯定不是它的子类,这个类用来动态生成数组或者操作数组(获得长度等)

再往深了想,还有很多让人感觉不自然的东西。可以肯定的是,java确实将数组作为了一个类来处理。还是用上面的例子说明:
可以通过以下方法得到MyClass[]的Class实例:arr.getClass()或MyClass[].class。这样,我就可以向数组类里面“窥探”了。
Class clazz = MyClass[].class;
System.out.println(clazz.getConstructors().length);
打印出来的结果是0;证明数组类确实没有构造方法。

数组类的“庐山真面目”:
System.out.println(clazz);
输出是:
[Larraytest.MyClass

对Java
Class文件结构稍有了解就知道,这个字符串的意思就是一个元素类型为arraytest.MyClass的一维数组。也就是说,数组类型不是和普通类
一样,以一个全限定路径名+类名来作为自己的唯一标示的,而是以[+一个或者多个L+数组元素类全限定路径+类来最为唯一标示的。这个()也是数组和普通
类的区别。而这个区别似乎在某种程度上说明数组和普通java类在实现上有很大区别。因为java虚拟机(java指令集)在处理数组类和普通类的时候,
肯定会做出区分。我猜想,可能会有专门的java虚拟机指令来处理数组。

分析到这里,基本上可以肯定:java对数组对象化的操作的支持是指令级的,也就是说java虚拟机有专门针对数组的指令。数组的Class类实例是java虚拟机动态创建动态加载的,其结构与普通java类的Class实例有一些不同。

JDK API中有一个java.lang.reflect.Array类,这个类提供了很多方法(绝大多数是native方法,这在另一个方面证明了java对数组的支持是专用指令支持的,否则用本地方去干嘛,用来弥补我们对数组操作的局限性。

下面这句话用来创建一个一维的、长度为10的、类型为arraytest.MyClass的数组:
arraytest.MyClass[] arr = (arraytest.MyClass[]) Array.newInstance(arraytest.MyClass, 10);

下面这句话用来创建一个二维的、3乘5的、类型为arraytest.MyClass的数组:
int[] arrModel = new int[]{3,5};
Object arrObj = Array.newInstance(Sub.class, arrModel);
当然你可以用一个数组的引用指向上面的二维数组,这里我们用一个Object的引用指向他。
使用的时候,我们也是可以利用Array类提供的方法来实现:

System.out.println(Array.getLength(arrObj);//第一维长度为3
System.out.println(Array.getLength(Array.get(arrObj, 2)));//第二维长度为5,这里如果写3,就会得到你意想之中的java.lang.

打印结果是如我所想的:
3
5

对于数组的Class类实例,还有一些奇怪的现象:
在运行代码 java.lang.reflect.Field fieldarr =
clazz.getField("length");的时候,会抛出异常:java.lang.NoSuchFieldException:
length,这似乎在说数组类没有length这个域,而这个域其实是我们用的最多的一个(也就是说这个域是肯定存在的)。我想关于数组的Class类
实例、数组的实现等,还有很多“猫腻”在里面。

顺便说一句,java数组最多只能是255维的。这个让人看到了C的影子,嘿嘿。

“Java把数组当作一个java类来处理”说起来容易,用起来自然,但是细细想来,还是有很多不简单的地方呀。

从对数组对象的进一步探讨,可以稍微了解Java对对象处理的一些方法。首先来看看一维数组的引用名称的定义:

int[] arr = null;

在这个定义中,arr表示一个可以参考引用自一维数组对象的变量名称,但是目前将这个名称参考引用自null,表示还没有指定这个名称参考引用自实际的对
象。在Java中,=运算用于基本数据类型时,是将值复制给变量,但当它用于对象时,则是将对象指定给参考引用名称来参考引用。也可以将同一个对象指定给
两个参考引用名称,当对象的值由其中一个参考引用名称进行操作而变更时,另一个参考引用名称所参考引用到的值也会变动。下面来看看范例5.8的示范。

ü 范例5.8 AdvancedArray.java

public class AdvancedArray {

public static void main(String[] args) {

int[] arr1 = {1, 2, 3, 4, 5};

int[] tmp1 = arr1;

int[] tmp2 = arr1;

System.out.print("通过tmp1取出数组值:");

for(int i = 0; i < tmp1.length; i++)

System.out.print(tmp1[i] + " ");

System.out.print("\n通过tmp2取出数组值:");

for(int i = 0; i < tmp2.length; i++)

System.out.print(tmp2[i] + " ");

tmp1[2] = 9;

System.out.print("\n\n通过tmp1取出数组值:");

for(int i = 0; i < tmp1.length; i++)

System.out.print(tmp1[i] + " ");

System.out.print("\n通过tmp2取出数组值:");

for(int i = 0; i < tmp2.length; i++)

System.out.print(tmp2[i] + " ");

System.out.println();

}

}

执行结果:

通过tmp1取出数组值:1 2 3 4 5

通过tmp2取出数组值:1 2 3 4 5

通过tmp1取出数组值:1 2 9 4 5

通过tmp2取出数组值:1 2 9 4 5

在这个范例中,通过tmp1名称改变了索引2的元素值,由于tmp2也引用自同一数组对象,所以tmp2取出索引2的元素值是改变后的值。事实上在范例
5.8中,有三个引用名称引用自同一个数组对象,也就是arr1、tmp1与tmp2,所以,如果取出arr1索引2的元素,元素值也会是9。

了解到在Java中数组是一个对象,而使用=指定时是将对象指定给数组名来引用,而不是将数组进行复制。如果想将整个数组的值复制给另一个数组该如
何作呢?可以使用循环,将整个数组的元素值遍历一遍,并指定给另一个数组相对应的索引位置。范例5.10示范了进行数组复制的方法。

Ü范例5.10 ArrayCopy.java

public class ArrayCopy {

public static void main(String[] args) {

int[] arr1 = {1, 2, 3, 4, 5};

int[] arr2 = new int[5];

for(int i = 0; i < arr1.length; i++)

arr2[i] = arr1[i];

for(int i = 0; i < arr2.length; i++)

System.out.print(arr2[i] + " ");

System.out.println();

}

}

执行结果:

1 2 3 4 5

另一个进行数组复制的方法是使用System类提供的array()方法。其语法如下:
System.array(来源, 起始索引, 目的, 起始索引, 复制长度);

范例5.11改写了范例5.10,使用System.array()进行数组复制,执行结果与范例5.10是相同的。

Ü范例5.11 ArrayCopy2.java

public class ArrayCopy2 {

public static void main(String[] args) {

int[] arr1 = {1, 2, 3, 4, 5};

int[] arr2 = new int[5];

System.array(arr1, 0, arr2, 0, arr1.length);

for(int i = 0; i < arr2.length; i++)

System.out.print(arr2[i] + " ");

System.out.println();

}
}

四、 Java中的数组作为对象带来的好处
1)越界检查

2)length field:与传统的C++中的数组相比,length字段可以方便的得到数组的大小;但要注意,仅仅可以得到数组的大小,不能得到数组中实际包含多少个元素,因为length 只会告诉我们最多可将多少元素置入那个数组。

3) 初始化:对象数组在创建之初会自动初始化成null,由原始数据类型构成的数组会自动初始化成零(针对数值类型),(Char)0 (针对字符类型)或者false (针对布尔类型)。

4) 数组作为返回值:首先,既然数组是对象,那么就可以把这个对象作为返回值;而且,不必担心那个数组的是否可用只要需要它就会自动存在而且垃圾收集器会在我们完成后自动将其清除

㈡ 数组是一个对象吗

没记错的话,java中数组属于引用数据类型,是属于对象的,楼上的回答应该是错的

㈢ java 对象数组定义是什么

对象是类的一个实例(对象不是找个女朋友),有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。

数组的三种定义方法

1.数组类型[] 数组名=new 数组类型[数组长度];

2.数组类型[] 数组名={数组0,数组1,数组2,数组3,....};

3.数组类型[] 数组名=new 数组类型[]{数组0,数组1,数组2,...};

㈣ java中数组是看成对象吗

本来就是。
除了int这些之外都是对象。一维数组的类型是Type[,TyPE是数组项的类型。

㈤ java数组属于什么类

java有八个基本数据类型:int ,short,long,boolean,String,char,double,float。
还包括引用数据类型:类,接口,数组。

所以,数组是属于引用数据类型,并不是什么类。数组是名称,并不是一个真是存在的类,数组可以定义成int,String,char等等各种类型。

㈥ JAVA数组中的各元素是对象吗

JAVA数据类型分为基本数据类型与引用类型
如果你声明的是基本数据类型的数组,那各元素都是基本数据类型,不是对象
如果你声明的是引用类型的数组,那各元素都是对象

㈦ Java中数组和对象数组的区别是什么

你说的“数组”和“对象数组”中的“数组”,是专指基本类型(primitive
type)数组吧。
在数组的层次上,无论是操作,还是定义,还是赋值,检索上,他们之间都是没有区别的。区别只是在于数组里装的东西不一样,一个是基本类型,一个是对象。
所以他们的区别,只在于数组里装的元素的区别。即基本类型和对象的区别。

㈧ java中一个数组可以看成一个类吗,数组当中的每一个元素可以看成一个对象吗

Java 语言中数组的定义是用来存储固定大小的同类型元素。数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。数组属引用类型,数组型数据是对象(object),数组中的每个元素相当于该对象的成员变量。数组是多个相同类型数据的组合,实现对这些数据的统一管理。一个数组实际上就是一连串的变量,数组按照使用可以分为一维数组、二维数组、多维数组。
数组的使用方式必须经历以下步骤:
1.声明数组变量
2.创建数组:分配内存给这个数组
我们可以认为数组就是一个容器。运算的时候有很多数据参与运算,首先就需要将数组储存在容器里,之后在运算时再针对数据做出具体操作

㈨ java 对象数组定义

写了一个简单的实例,你可以参考一下。
public class a {
public static void main(String[]args){

int a[]={3,9,8};//这个是数组的静态初始化.

Date days[]={new Date(1,4,2994),new Date(2,4,2004),new Date(2,5,2005)};
//创建了3个Date对象放在days[]数组里。

//这里还有种写法。你可以先定义个数组,然后动态的进行付值。

//这样写可能烦了点,你也可以用for循环来进行动态赋值。

//列:Date days[];

// days=new Date[3];

// days[0]=new Date(1,2,3);

// days[1]=new Date(1,2,3);

// days[2]=new Date(1,2,3);

for(int i=0;i<days.length;i++){

//循环数组里的对象
System.out.println(days[i].a);
//将对象中的a属性打印输出。

}
}
}

class Date{
int a,b,c;
Date(int x,int y,int z){
a=x;
b=y;
z=c;
}
}

㈩ java中数组是看成对象吗

1 一样,数组是运行时生成的一个特殊的类的对象而已,和c语言的数组完全不同的概念,只是用法、语法类似。
2 对象都是引用传递,数组是对象,所以传递也是引用

热点内容
比亚迪唐dmi哪个配置值得买 发布:2025-01-04 05:50:17 浏览:169
内存储器的功能 发布:2025-01-04 05:50:11 浏览:679
sqlcountsum 发布:2025-01-04 05:49:24 浏览:233
linux怎么改ip 发布:2025-01-04 05:39:32 浏览:477
c语言mallocfree 发布:2025-01-04 05:38:49 浏览:267
台式电脑在哪里设置密码锁 发布:2025-01-04 05:36:27 浏览:631
msg编译路径 发布:2025-01-04 05:36:26 浏览:666
雷霆战机电脑脚本 发布:2025-01-04 05:26:43 浏览:995
原神在哪里下载安卓手机 发布:2025-01-04 05:21:50 浏览:378
csr2安卓正式服在哪里 发布:2025-01-04 05:17:33 浏览:222