前言
欢迎关注个人主页:逸狼
创造不易,可以点点赞吗~
如有错误,欢迎指出~
目录
前言
接口实例运用
代码举例理解
比较对象的年龄
比较对象的姓名
利用冒泡排序实现Array.sort
年龄比较器
姓名比较器
比较示例测试
clone接口
浅拷贝和深拷贝
浅拷贝
图解
代码举例
深拷贝
图解
代码举例
接口实例运用
接口实现比较引用数据类型(对于引用类型数据来说,不能直接用大于小于号来比较)
代码举例理解
这里要比较两个对象的大小(指定某种方式比较,比如 年龄等)
比较对象的年龄
package demo6;//接口Comparable 实现 比较引用类型数据的方法,这里面的comparable 的compareTo需要重写
class Student implements Comparable<Student>{public String name;public int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}@Override//要重写这个方法public int compareTo(Student o) {/* if(this.age>o.age){//this表示当前对象,o表示传的参数return 1;}else if(this.age<o.age){return 0;}else{return -1;}*///代码改良return this.age-o.age;}
}public class Test6 {public static void main(String[] args) {Student student1=new Student("zhangsan",20);Student student2=new Student("lisi",5);
// 比较student1和student2,如果1大于2,返回大于0的数字,否则返回小于0的数字if(student1.compareTo(student2)>0){//调用的是student1的比较方法,传的是参数是student2System.out.println("student1>student2");}else{System.out.println("student1<=student2");}}
}
测试结果
比较对象的姓名
name是String类型,Java里面自带了字符串比较方法compareTo,比较的是字符串的ASCII码值
@Override//要重写这个方法public int compareTo(Student o) {if(this.name.compareTo(o.name)>0){//this表示当前对象,o表示传的参数return 1;}else if(this.name.compareTo(o.name)==0){return 0;}else{return -1;}
这里有问题:Comparable接口有局限性(一旦这个类写死了比较方式,就不能随意更改)
利用冒泡排序实现Array.sort
public class Test6 {//冒泡排序 模拟实现引用数据类型的排序public static void mySort(Comparable[] comparable){for (int i = 0; i < comparable.length-1; i++) {for (int j = 0; j < comparable.length-1-i; j++) {if(comparable[j].compareTo(comparable[j+1])>0){//交换Comparable tmp=comparable[j];comparable[j]=comparable[j+1];comparable[j+1]=tmp;}}}}public static void main(String[] args) {Student[] students=new Student[3];students[0]=new Student("zhangsan",8);students[1]=new Student("lisi",4);students[2]=new Student("wangwu",10);mySort(students);System.out.println(Arrays.toString(students));}}
代码结果(这里是根据学生的年龄排的结果)
年龄比较器
package demo;import java.util.Comparator;public class AgeComparator implements Comparator<Student> {@Overridepublic int compare(Student o1, Student o2) {return o1.age-o2.age;}
}
姓名比较器
package demo;import java.util.Comparator;public class NameComparator implements Comparator<Student> {@Overridepublic int compare(Student o1,Student o2) {return o1.name.compareTo(o2.name);}
}
比较示例测试
public class Test {public static void main(String[] args) {Student student1=new Student("zhangsan",4);Student student2=new Student("lisi",6);//年龄比较器AgeComparator ageComparator=new AgeComparator();int ret=ageComparator.compare(student1,student2);System.out.println(ret);//名字比较器NameComparator nameComparator=new NameComparator();int ret2=nameComparator.compare(student1,student2);System.out.println(ret2);}
clone接口
前提:任何一个对象默认都是继承Object类的(是所有类的父类)
package demo3;class Student implements Cloneable{//CloneNotSupportedException 必须实现Cloneable接口public int age;public Student(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"age=" + age +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();//Object中的clone方法使用了protected修饰,所以要重写,并用super访问}
}public class Test {public static void main(String[] args) throws CloneNotSupportedException {Student student1=new Student(10);Student student2=(Student)student1.clone() ;//clone是父类方法,在子类中使用要强制转换 (向下转型)}
}
浅拷贝和深拷贝
浅拷贝
两个引用指向一个对象,如两个Student指向一个Money
图解
代码举例
package demo3;class Money {public double money=12.5;
}class Student implements Cloneable{//CloneNotSupportedException 必须实现Cloneable接口public int age;public Money m=new Money();public Student(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"age=" + age +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();//Object中的clone方法使用了protected修饰,所以要重写,并用super访问}
}public class Test {public static void main(String[] args) throws CloneNotSupportedException {Student student1=new Student(10);Student student2=(Student)student1.clone() ;//clone是父类方法,在子类中使用要强制转换 (向下转型)System.out.println(student1.m.money);//12.5System.out.println(student2.m.money);//12.5System.out.println("============");student2.m.money=100;System.out.println(student1.m.money);System.out.println(student2.m.money);}
}
打印结果
这里通过对象student2修改了money,而student1的money也被修改了
深拷贝
两个引用指向两个对象,如两个Student指向两个个Money
图解
代码举例
package demo3;class Money implements Cloneable{//表示Money支持克隆功能public double money=12.5;@Overrideprotected Object clone() throws CloneNotSupportedException {//要重写克隆方法return super.clone();}
}class Student implements Cloneable{//CloneNotSupportedException 必须实现Cloneable接口public int age;public Money m=new Money();public Student(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"age=" + age +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {Student tmp=(Student)super.clone();tmp.m=(Money)this.m.clone();return tmp;}
}public class Test {public static void main(String[] args) throws CloneNotSupportedException {Student student1=new Student(10);Student student2=(Student)student1.clone() ;//clone是父类方法,在子类中使用要强制转换 (向下转型)System.out.println(student1.m.money);//12.5System.out.println(student2.m.money);//12.5System.out.println("============");student2.m.money=100;System.out.println(student1.m.money);System.out.println(student2.m.money);}
}
打印结果
这里通过对象student2修改了money,student1的money不会被修改。