创建对象
构造方法
用于对象的初始化,通过new
调用,方法名和类名相同。编译器会自动添加无参构造器,如果自定义了构造方法,默认无参构造方法会失效。
拷贝
对象拷贝
直接使用=
,只拷贝了指向对象的指针,里面的数据全都没有拷贝,修改新的对象里的数据会直接修改原对象。
浅拷贝
两种方式
-
拷贝构造方法
/* 拷贝构造方法实现浅拷贝 */ public class CopyConstructor { public static void main(String[] args) { Age a=new Age(20); Person p1=new Person(a,"摇头耶稣"); Person p2=new Person(p1); System.out.println("p1是"+p1); System.out.println("p2是"+p2); //修改p1的各属性值,观察p2的各属性值是否跟随变化 p1.setName("小傻瓜"); a.setAge(99); System.out.println("修改后的p1是"+p1); System.out.println("修改后的p2是"+p2); } } class Person{ //两个属性值:分别代表值传递和引用传递 private Age age; private String name; public Person(Age age,String name) { this.age=age; this.name=name; } //拷贝构造方法 public Person(Person p) { this.name=p.name; this.age=p.age; } public void setName(String name) { this.name=name; } public String toString() { return this.name+" "+this.age; } } class Age{ private int age; public Age(int age) { this.age=age; } public void setAge(int age) { this.age=age; } public int getAge() { return this.age; } public String toString() { return getAge()+""; } }
-
重写
clone
方法/* clone方法实现浅拷贝 */ public class ShallowCopy { public static void main(String[] args) { Age a=new Age(20); Student stu1=new Student("摇头耶稣",a,175); //通过调用重写后的clone方法进行浅拷贝 Student stu2=(Student)stu1.clone(); System.out.println(stu1.toString()); System.out.println(stu2.toString()); //尝试修改stu1中的各属性,观察stu2的属性有没有变化 stu1.setName("大傻子"); //改变age这个引用类型的成员变量的值 a.setAge(99); //stu1.setaAge(new Age(99)); 使用这种方式修改age属性值的话,stu2是不会跟着改变的。因为创建了一个新的Age类对象而不是改变原对象的实例值 stu1.setLength(216); System.out.println(stu1.toString()); System.out.println(stu2.toString()); } } /* * 创建年龄类 */ class Age{ //年龄类的成员变量(属性) private int age; //构造方法 public Age(int age) { this.age=age; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String toString() { return this.age+""; } } /* * 创建学生类 */ class Student implements Cloneable{ //学生类的成员变量(属性),其中一个属性为类的对象 private String name; private Age aage; private int length; //构造方法,其中一个参数为另一个类的对象 public Student(String name,Age a,int length) { this.name=name; this.aage=a; this.length=length; } //eclipe中alt+shift+s自动添加所有的set和get方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public Age getaAge() { return this.aage; } public void setaAge(Age age) { this.aage=age; } public int getLength() { return this.length; } public void setLength(int length) { this.length=length; } //设置输出的字符串形式 public String toString() { return "姓名是: "+this.getName()+", 年龄为: "+this.getaAge().toString()+", 长度是: "+this.getLength(); } //重写Object类的clone方法 public Object clone() { Object obj=null; try { obj= super.clone(); //调用Object类的clone方法,返回一个Object实例 } catch (CloneNotSupportedException e) { e.printStackTrace(); } return obj; } }
深拷贝
对整个对象图进行拷贝,如果该对象的成员变量有引用类型,同时也要拷贝该引用指向的对象。
- 对每层对象进行浅拷贝==深拷贝,缺点是代码量繁杂
- 使用对象序列化