1.Clonable接口和深拷贝
Java 中内置了一些很有用的接口, Clonable 就是其中之一,Object 类中存在一个 clone 方法,调用这个方法可以创建一个对象的 "拷贝". 但是要想合法调用 clone 方法, 必须要先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常。
class Students implements Cloneable { public String name; public int age; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } public Students(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "{" + "name=" + name + ", age=" + age + "}"; } }
public class text { public static void main(String[] args) throws CloneNotSupportedException { Students student1=new Students("张三",10); Students student2=(Students) student1.clone();//强制类型转化 System.out.println(student1); System.out.println(student2); } }
class Money{ public double m=25.0; } class Students implements Cloneable { public String name; public int age; public Money money=new Money(); @Override 浅拷贝 protected Object clone() throws CloneNotSupportedException { return super.clone(); } public Students(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "{" + "name=" + name + " "+ ", age=" + age +" "+ ", money=" + money.m + '}'; } } public class text { public static void main(String[] args) throws CloneNotSupportedException { Students student1=new Students("张三",10); Students student2=(Students) student1.clone(); System.out.println(student1); System.out.println(student2); System.out.println("===="); student1.money.m=15.0; System.out.println(student1); System.out.println(student2); } }
通过clone,我们只是拷贝了Students对象,但是Students对象中的Money对象,并没有拷贝,通过student1这个引用修改了m的值后,student2这个引用访问m的时候,值也发生了改变。
class Money implements Cloneable{ public double m=25.0; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } class Students implements Cloneable { public String name; public int age; public Money money=new Money(); @Override //深拷贝,将引用的对象(student1)中的对象也拷贝到目标对象中 protected Object clone() throws CloneNotSupportedException { Students temp=(Students) super.clone(); temp.money=(Money)this.money.clone(); return temp; } public Students(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "{" + "name=" + name + " "+ ", age=" + age +" "+ ", money=" + money.m + '}'; } } public class text { public static void main(String[] args) throws CloneNotSupportedException { Students student1=new Students("张三",10); Students student2=(Students) student1.clone(); System.out.println(student1); System.out.println(student2); System.out.println("===="); student1.money.m=15.0; System.out.println(student1); System.out.println(student2); } }
通过clone,我们拷贝Students对象,同时将Students对象中的Money对象也进行拷贝。通过student1这个引用修改了m的值后,student2这个引用访问m的时候,值不会发生改变。
2.抽象类和接口的区别
抽象类和接口都是 Java 中多态的常见使用方式. 都需要重点掌握. 同时又要认清两者的区别,
核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法。
抽象类存在的意义是为了让编译器更好的校验, 像 Animal 这样的类我们并不会直接使用, 而是使用它的子类.万一不小心创建了 Animal 的实例, 编译器会及时提醒我们。
3.Object类
Object是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。默认会继承Object父类。即所有类的对象都可以使用Object的引用进行接收。
例如:使用Object接收所有类的对象。。
class Person{ } class Student{ } public class Test { public static void main(String[] args) { function(new Person()); function(new Student()); } public static void function(Object object) { System.out.println(object); } }
Object类中有以下方法