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

基本数据类型( 直接赋值):八大数据类型赋值。

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


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


小结:

对象数组就是一堆地址,变量放在栈中,新建的对象放在堆中。(彻底理解堆栈)





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值