Java 语言基础之对象数组(内存结构拓展)
2015-10-22 10:36
525 查看
基本数据类型( 直接赋值):八大数据类型赋值。
引用数据类型( 直接赋值,不过是地址赋值):对象赋值,数组赋值,对象数组赋值。
对象数组就是一个数组里都是对象,传值也是引用传值的方式直接将地址传过去,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; } }
小结:
对象数组就是一堆地址,变量放在栈中,新建的对象放在堆中。(彻底理解堆栈)
相关文章推荐
- java 多线程实践
- Java 8新的时间日期库的20个使用示例
- java基础回顾----多态
- [Java]系统级性能监控及优化
- Java异常
- Java设计模式---适配器模式(Adapter)
- Java设计模式---适配器模式(Adapter)
- 从头认识java-2.2 算术操作符
- 从头认识java-2.2 算术操作符
- spring3.1 spring.profiles.active
- Spring Boot开发之流水无情(二)
- struts2 传值乱码问题解决方案
- eclipse的使用
- Java相对路径/绝对路径总结(转)
- Java基础增强2-枚举,可变参数
- java-org.springframework.beans.factory.NoSuchBeanDefinitionException
- Java基础学习总结——Java对象的序列化和反序列化
- HttpClient 在Java项目中的使用详解
- Eclipse自动生成FindViewById,不用手写
- HDU1041 Computer Transformation(java)