如何理解数组也是对象

**何为数组:**数组是在内存中存储相同数据类型的连续的空间,声明一个数组就是在内存空间中划出一串连续的空间。在Java的标准函数库中包含了许多复杂的数据结构,如map、tree、set等等,但如果需要快速、有序、有效率地排列元素时,数组是一个不错的选择。它能够让你使用位置索引来快速、随机地存取其中的元素。

值得注意的是,在Java中,数组长度一旦被声明,就不可再更改。不同于C或一些其他语言,可以声明为长度可变的数组。

在Java中(或许其他语言也是这样,但这里我以Java举例)数组也是对象。那么如何理解这句话呢?

数组中的每个元素都是变量。换而言之,会是8种primitive主数据类型变量中的一种,或者是引用变量,但这两种是不同的。例如对于int类型数组中,每个元素都可以装载一个int。但是对于引用变量来讲,它只会保存引用,而非这个对象的本身。

我们用代码来具体看看
我们创建大小为7的数组,并将它赋值给之前声明为int[ ]的变量nums:

int[] nums = new int[7];

赋予int数组的每一个元素int值(注意在int数组中每个元素皆为int类型的变量)

nums[0] = 6;
nums[1] = 7;
nums[2] = 8;
nums[3] = 9;
nums[4] = 10;
nums[5] = 11;
nums[6] = 12;

这里注意到,虽然元素本身是primitive主数据类型,但数组本身却是个对象。

再看引用数组
我们声明并创建一个大小为7的Dog数组,并赋值给前面所声明出的Dog[ ]类型变量pets.。

Dog[] pets = new Dog[7];

但是这里我们需要注意,这里我们是对Dog的引用,而缺少了实际的Dog对象!

于是我们需要创建新的Dog对象并将他们赋值给数组的元素。

pets[0] = new Dog();
pets[1] = new Dog();
...

和8种主数据类型不同,数组也是对象的概念这里已可以初见端倪。

用一段完整的代码来看看。
Dog的范例:

Dog
name
bark()
class Dog{
	String name;
	public static void main(String[] args){
		//创建Dog对象
		Dog dog1 = new Dog();
		dog1.bark();
		dog1.name = "Bart";
		
		//创建Dog数组
		Dog[] myDogs = new Dog[3];
		
		myDogs[0] = new Dog();
		myDogs[1] = new Dog();
		myDogs[2] = dog1;
		
		//通过数组引用存取Dog
		myDogs[0].name = "Fred";
		myDogs[1].name = "Marge";
		
		//myDog[2]的名字是
		System.out.print(myDogs[2].name);
		
		//逐个对Dog执行bark()
		int x = 0;
		while (x < myDogs.length){
			myDogs[x].bark();
			x++;
		}
	}
	public void bark(){
		System.out.println(name);
	}
}

输出如下

null
Bart
Fred
Marge
Bart

(没有引用到任何对象的引用变量的值为null值)

Java注重类型

一旦数组被声明出来,你就只能装入所声明类型的元素。

举例来讲,就是不能将Cat装入Dog数组中。double也不能放入int数组中(但是可以将byte放进int数组中,这被称作隐含展开)。

数组一定是个对象,不管所声明的元素是否为primitive主数据类型。
没有primitive主数据类型的数组,只有装载primitive主数据类型的数组。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值