public class Person{
String name;
int age;
public void tell(){
–System.out.println(“姓名:”+name+“年龄:”+age);
}
public class Example{
public static void main(String args[]){
Person per1=null;
Person per2=null;
per1=new Person();
per2=new Person();
per1.name=“张三”;
per1.age=30;
per2.name=“李四”;
per2.age=33;
per2=per1;
per2.age=25;
per1.tell(); //输出什么? 姓名:张三 年龄:25
}
}
对象的内存分配
对象保存在栈内存中,数据成员保存在堆内存中。每个对象在内存里都有自己的一份数据拷贝。
方法成员保存在代码区,在内存中只有一份拷贝,同一个类的所有对象共享同一段程序代码。
思考:对象共享同一段程序代码,如何区分不同对象的数据?
this变量代表对象本身。每一个方法成员内部都有一个this引用变量,指向当前的对象。每当调用一个实例方法时,this变量将被设置成引用该实例方法的特定的类对象,Java编译器会将该变量传递到实例方法。方法的代码接着可以与this所代表的对象的特定数据建立关联。
5,对象复制:深复制与浅复制
1,什么时候需要用到对象复制?
状态复制
显示的赋值
– 直接将一个对象的状态复制到另一个对象
对象初始化
–用一个现有对象的状态确定一个新建对象的状态
制作副本
对象作为方法的参数
–对象按值调用。
对象作为返回值
–将方法中的局部对象复制一份并返回
JAVA的对象传递
在Java中,对象作为参数的传递效果总是按引用传递。只有对象引用的复制,不会发生对象实例的复制。
优点:高效(无需制作副本)
缺点:不安全(方法调用有副作用)
用final修改对象参数,仍无法改正以上缺点,因为这样仅仅保证了对象引用没有副作用,对象实例仍可能被改变。
解决方法:在方法里复制对象,达到按值传递对象的效果。
优点:安全
缺点:低效(需要制作副本,更多的手工编程)
2,深复制与浅复制的区别
复合对象:对象中还包含了其他对象的引用。
深浅复制只对复合对象才有意义,对普通对象来说效果一样。
对复合对象,深浅复制的区别:
浅复制:仅复制复合对象的根对象——只复制了对象引用,不复制对象实例
深复制:复制复合对象的整个结构——深复制递归复制复合对象中的每个子对象
深浅复制实例——实现Cloneable接口
Object类是所有类的基类,所有的类都继承自Object类。
Object类里定义的clone()方法采用的是浅复制策略。
public class Teacher{
String name;
int age;
public Teacher(String name, int age){
This.name = name;
This.age = age;
}
}
public class student implements Cloneable{
String name;
Teacher teacher;
public student(String name, Teacher teacher){
this.name=name;
this.teacher=teacher;
}
public Object clone(){
Student stu=null;
try{
stu=(Student)super.clone();
}catch(CloneNotSupportedException e){
System.out.println(e.toString());
}
//stu.teacher=(Teacher)teacher.clone();
return stu;
}
}
Teacher teacher = new Teacher(“张三”,30);
Student stu1 = new Student(“小明”,teacher);
Student stu2 = (Student)stu1.clone();
stu2.teacher.name=“李四”;
stu2.teacher.age = 32;
System.out.println(stu1.name+“老师信息:”+stu1.teacher.name+“ ”+stu1.teacher.age );
//输出结果是?
小明老师信息:李四 32
深复制
修改Teacher类(父类),为Teacher类重定义clone方法。
public class Teacher inplementsCloneable{
String name;
int age;
public Teacher(String name, int age){
This.name = name;
This.age = age;
}
public Object clone(){
Teacher teacher=null;
try{
teacher=(Teacher)super.clone();
}catch(CloneNotSupportedException e){
System.out.println(e.toString());
}
//this.name = new String(teacher.name);
return teacher;
}
}
分享到: