基本数据类型( 直接赋值):八大数据类型赋值。
引用数据类型( 直接赋值,不过是地址赋值):对象赋值,数组赋值,对象数组赋值。
对象数组就是一个数组里都是对象,传值也是引用传值的方式直接将地址传过去,Java简单粗暴的应用方式。
第一个例子说明对象数组中放入的都是对象的地址。
public class Main {
public static void main(String args[]) {
Person p3=new Person();
Person [] persons ={p3,p3,p3};
persons[0].setAge(88);
// 由于对象数组中放入的都是对象的地址,所以当指向地址相同时,改变其中一个就是改变
所有persons[]对象的内容了。
System.out.println(persons[0].getAge());
System.out.println(persons[1].getAge());
System.out.println(persons[2].getAge());
}
}
class Person {
private int age;
public static int count;
public Person() {
count++;
System.out.println("Person 创建了"+count+" 对象");
}
public Person(int age) {
this.age = age;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return this.age;
}
}
第二个例子数组对象传参:
public class Main {
public static void main(String args[]) {
Person[] ps = new Person[2]; // new Person[2] 一个长度为2的对象数组
ps[1]=new Person(); // 必须先进行赋值,才能进行数据设置ps[1].setAge(12);
ps[1].setAge(12);
changes(ps);
System.out.println("ps[1].setAge : "+ps[1].getAge());
}
// changes 方法
// 对象数组是引用传值的方式,所以进入changes,ps(changes的ps)指向了ps(main函数的ps)之后,他们指向相同的地址,即可直接改变age值。
public static void changes(Person[] ps)
{
ps[1].setAge(28); // 将新建里的对象的值改为28
}
}
class Person {
private int age;
public static int count;
public Person() {
count++;
System.out.println("Person 创建了"+count+" 对象");
}
public Person(int age) {
this.age = age;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return this.age;
}
}
第三个例子 在调用函数的时候建立新的对象赋值,导致形参指向别的地址,无法改变实参内容:
public class Main {
public static void main(String args[]) {
Person[] ps = new Person[2]; // new Person[2] 一个长度为2的对象数组
ps[1]=new Person(); // 必须先进行赋值,才能进行数据设置ps[1].setAge(12);
ps[1].setAge(12);
changes(ps);
System.out.println("ps[1].setAge : "+ps[1].getAge());
}
// changes 方法
public static void changes(Person[] ps)
{
ps = new Person[4]; // 单纯的建立4个长度的对象数组,数组内对象指向NULL
ps[1]=new Person(); // 声明对象数组之后,必须先进行赋值,才能设置参数
ps[1].setAge(28); // 将新建里的对象的值改为28
}
}
// 虽然在changes函数中改变了ps[1]对象的值,但是由于在改变值的时候ps已经被 new Person[4];赋了新值,即使名字相同,但是由于指的地址已经改变,所以不会改变main函数中的ps[1]内容。所以程序输出结过仍旧为12.
class Person {
private int age;
public static int count;
public Person() {
count++;
System.out.println("Person 创建了"+count+" 对象");
}
public Person(int age) {
this.age = age;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return this.age;
}
}
小结:
对象数组就是一堆地址,变量放在栈中,新建的对象放在堆中。(彻底理解堆栈)