您的位置:首页 > 编程语言 > Java开发

Java 语言基础之对象数组(内存结构拓展)

2015-10-22 10:36 525 查看
基本数据类型( 直接赋值):八大数据类型赋值。

引用数据类型( 直接赋值,不过是地址赋值):对象赋值,数组赋值,对象数组赋值。

对象数组就是一个数组里都是对象,传值也是引用传值的方式直接将地址传过去,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;
}
}


小结:

对象数组就是一堆地址,变量放在栈中,新建的对象放在堆中。(彻底理解堆栈)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: