目录
一、JDK内置的两大接口
1、java.lang.Comparable:比较接口
Student是自定义类型,当使用Arrays.sort对自定义类型进行排序时,自定义类型需要实现Comparable,使其具备可比较的能力。
//compare 接口
public class Student implements Comparable<Student>{//泛型
private String name;
private int age;
public Student(String name,int age){
this.name = name;
this.age = age;
}
//快捷键 alt + insert
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public static void main(String[] args){
Student stu1 = new Student("大喵",26);
Student stu2 = new Student("二小",12);
Student stu3 = new Student("三乖",3);
Student[] students = {stu1,stu2,stu3};
//数组排序算法,年龄升序排列
Arrays.sort(students);
System.out.println(Arrays.toString(students));
}
//此时根据年龄大小来比较,升序排列
public int compareTo(Student o){
if (this.age == o.age){
return 0;
}else if (this.age < o.age){
return -1;
}
return 1;
}
// @Override
// public int compareTo(Student o) {
// return 0;
// }
}
2、java.lang.Cloneable :克隆接口
程序中的克隆:复制一个新的对象,新的对象的属性值是从旧对象中拷贝过来的。
//Cloneable 克隆 是标记接口,没有抽象方法
public class Animal implements Cloneable{
private String name;
protected Animal clone() throws CloneNotSupportedException{
return (Animal) super.clone();
}
public static void main(String[] args) throws CloneNotSupportedException {
Animal animal = new Animal();
animal.name="zzz";
Animal animal1 = animal.clone();
System.out.println(animal == animal1);//false
System.out.println(animal1.name);//zzz
}
}
二、深浅拷贝
b1.a.num = 100;//对于b2来说是可见的 -> b1.a和b2.a指向了相同的对象,这种拷贝就称为浅拷贝.
此处的b1和b2确实是两个不同的对象,但是b1和b2内部包含了'A类的引用,这个引用指向相同地址(浅拷贝)
b1和b2内部包含的a确实不是一个对象,这种拷贝称为深拷贝。
实现深拷贝的两种方式: a.递归的实现Cloneable b.通过序列化来进行拷贝 Serializable 将对象转为json字符串(序列化)-都是深拷贝 序列化: 将一个对象转为String
//深浅拷贝
// 用 // 起来的是浅拷贝
class A{
//class A implements Cloneable{
int num;
// protected A clone() throws CloneNotSupportedException{
// return (A) super.clone();
// }
}
public class B implements Cloneable{
A a = new A();
@Override
protected Object clone() throws CloneNotSupportedException {
// B newB = (B) super.clone();
// newB.a = a.clone();
// return newB;
return (B) super.clone();
}
public static void main(String[] args) throws CloneNotSupportedException {
B b1 = new B();
B b2 = (B) b1.clone();
System.out.println(b1 == b2);//false
System.out.println(b2.a.num);//0
b1.a.num = 100;
System.out.println(b2.a.num);//100 //0
}
}
三、代理设计模式
代理设计模式:基于接口的一个接口两个实现类, 一个是真实业务类,另一个是辅助真实业务的代理类。最终将真实业务传递给代理类来完成整个业务的实现。(以代购电脑为例)
//业务接口,你要干的事,你要买的东西
interface ISubject{
//代理核心业务 买个电脑
void buyComputer();
}
//真正业务类。真正付钱买电脑的那个人
class RealSubject implements ISubject{
@Override
public void buyComputer() {
System.out.println("买个mac pro 15寸顶配,YYDS~");
}
}
//代理类,辅助我们买电脑
//代理类中有买电脑的辅助操作
class ProxySubject implements ISubject{
private ISubject realSubject;
public ProxySubject(ISubject subject){
this.realSubject = subject;
}
public void preHandle(){
System.out.println("买飞机票去漂亮国~");
}
@Override
public void buyComputer() {
preHandle();
//付钱这个操作是由真是业务来处理的
this.realSubject.buyComputer();
postHandle();
}
public void postHandle(){
System.out.println("再买飞机票回国,送14+7大礼包(隔离)~");
}
}
//最终通过平台,将代理人和客户建立联系
class Platform{
public static ISubject getInstance(){
//在代购平台上下单
return new ProxySubject(new RealSubject());
}
}
public class Subject {
public static void main(String[] args) {
ISubject subject = Platform.getInstance();
subject.buyComputer();
}
}
四、源代码
本小节完^_^