数组的定义
- 数组是相同类型数据的有序集合。
- 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。
- 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。
数组的四个基本特点
其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
其元素必须是相同类型,不允许出现混合类型。
数组中的元素可以是任何数据类型,包括基本类型和引用类型。
数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。
数组的声明与创建
dataType[ ] arrayRefVar = new dataType[ arraySize];
dataType[ ][ ] arrayRefVar = new dataType[ arraySize][ arraySize];
数组的引用
public class Main {
public static void main(String[] args) {
int[] a = {1, 2, 3};
a[0] = 0;
for(int i : a) {
System.out.println(i); //这里会输出什么?
}
}
}
public class Main {
public static void main(String[] args) {
String[] names = {"ABC", "XYZ", "zoo"};
String s = names[1];
names[1] = "cat";
System.out.println(s); // s是"XYZ"还是"cat"?
for(String i : names) {
System.out.println(i); //这里会输出什么?
}
}
}
结论:输出"ABC" "cat" "zoo"。分析见下。
注意数组是引用类型,并且数组大小不可变。我们观察下面的代码:
public class Main {
public static void main(String[] args) {
// 5位同学的成绩:
int[] ns;
ns = new int[] { 68, 79, 91, 85, 62 };
System.out.println(ns.length); // 5
ns = new int[] { 1, 2, 3 };
System.out.println(ns.length); // 3
}
}
本例中,ns指向了新的内存地址,其本身(原地址)被垃圾回收机制回收。(可能是吧,我是垃圾,并不清楚)
字符串数组
如果数组元素不是基本类型,而是一个引用类型,那么,修改数组元素会有哪些不同?
字符串是引用类型,因此我们先定义一个字符串数组:
字符串数组存放的是 各字符串常量的 地址!
String[] names = { "ABC", "XYZ", "zoo" };
思考下面这个例子(从引用的指向分析):
思考下面这个例子:
public class Example{
String str=new String("tarena");
char[]ch={'a','b','c'};
public static void main(String args[]){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+" and ");
System.out.print(ex.ch);
}
public void change(String str,char ch[]){
//引用类型变量,传递的是地址,属于引用传递。
str="test ok";
ch[0]='g';
}
}
多态数组
数组的定义类型为父类类型,里面保存的多态元素为子类类型。
public class Person {
public static void main(String[] args) {
Person[] person = new Person[4];
person[0] = new Person("jack",20);
person[1] = new Person("lucy",10);
person[2] = new Student("mary",8,2000);
person[3] = new Teacher("hsp",20,88888);
for(Person p : person) {
System.out.println(p);
}
}
protected String name;
protected int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
class Student extends Person{
private double salary;
public Student(String name, int age, double salary) {
super(name, age);
this.salary = salary;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
'}';
}
}
class Teacher extends Person{
private double salary;
public Teacher(String name, int age, double salary) {
super(name, age);
this.salary = salary;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
'}';
}
}