接口使用实例和Object类及内部类
Comparable 接口
查看接口ctrl+鼠标
sort 要求传入的数组的每个对象都是“可比较”的,也就是说对象中的某个成员变量可以进行比较(比如姓名、年龄等)。这样通过重写 compareTo 方法
就可以定义比较规则
Comparable接口是一个泛型(要比较什么类型,就把类名传入)接口,用于定义对象的排序规则。该接口中只有一个方法compareTo(),用于比较这个对象与另一个对象的大小关系。
compareTo()方法
int compareTo(T obj)
用法:
compareTo()方法返回一个整数值,表示当前对象与参数对象的大小关系:
如果返回值小于0,表示当前对象小于参数对象;
如果返回值等于0,表示当前对象等于参数对象;
如果返回值大于0,表示当前对象大于参数对象。
Comparable接口需要实现类重写compareTo()方法,根据对象的某个属性或多个属性进行比较,从而确定对象的大小关系。
一般情况下自定义类型可以进行比较
比较器Comparator接口
用于定义两个对象之间的比较规则。它通常用于排序算法中,使得对象可以按照自定义的规则进行排序。
比较器接口中只有一个方法:compare(Object o1, Object o2),该方法用于比较两个对象。返回一个负整数、零或正整数,表示o1小于、等于或大于o2。根据返回值的不同,可以确定两个对象的相对顺序。
比较器的使用可以实现灵活的排序规则,不依赖于对象的自然排序。它可以按照不同的属性、不同的顺序进行排序,同时也可以处理特定的比较需求,例如忽略大小写比较字符串等。
Clonable 接口
Object 类中存在一个 clone
方法,调用这个方法可以创建一个对象的拷贝,要调用 clone 方法,需要先实现 Clonable 接口
,否则就会抛出 CloneNotSupportedException 异常(不支持克隆异常)
class Person implements Cloneable{//当自己写的类型支持克隆时,一定要使用克隆接口
public String name;
public int age;
public Money money = new Money();
public Person(String name, int age) {//提供构造方法
this.name = name;
this.age = age;
}
浅拷贝 VS 深拷贝
Cloneable接口的clone方法可以实现浅拷贝,如果要实现深拷贝,那么让需要对对象中的引用类型进行拷贝
深浅拷贝与代码的实现有关

深拷贝:克隆出一份地址 相当于有两份地址
Object类
概念
Object类是Java中所有类的父类。它定义了一些通用的方法,可以被其他类继承和重写
public static void func(Object obj) {
System.out.println(obj);
}
类中的方法, 开锁的可以直接使用被public修饰;锁起来被private修饰(间接调用)
Object类中也有一些定义好的方法
获取对象信息toString方法
如果要打印对象中的内容,就需要重写Object类中的toString()方法,不然会打印出它的地址(内存地址的字符串表示形式)
// Object类中的toString()方法实现:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
对象比较equals方法
要比较对象的内容是否相等,那就要用到equals方法,但是需要进行重写
,因为它默认
是按地址
进行比较的
我们常见的
==
就可以实现比较,它在比较时:
如果它左右操作数是基本类型变量,比较的是变量中值是否相同
如果左右两侧是引用类型变量,则比较引用变量地址是否相同
如果不重写,默认为:
比较person:
@Override//idea可以直接生成
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && name.equals(person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
public static void main(String[] args) {
Person person = new Person("zs", 10);
Person person1 = new Person("zs", 10);
// System.out.println(person == person1);
System.out.println(person.equals(person1));
}
内部类
概念
public class OutClass {
class InnerClass{
}
}
// OutClass是外部类
// InnerClass是内部类
【注意事项】1. 定义在 class 类名 {} 花括号外部的,即使是在一个文件里,都不能称为内部类2. 内部类和外部类共用同一个 java 源文件,但是经过编译之后, 内部类会形成单独的字节码文件
分类
实例内部类
内部类生成的字节码文件--通过外部类引出
必须要静态的时候添加final--让时间更早
静态内部类
【 注意事项】1. 在静态内部类中只能访问外部类中的静态成员确实想访问:2. 创建静态内部类对象时,不需要先创建外部类对象
局部内部类
【 注意事项】1. 局部内部类只能在所定义的方法体内部使用2. 不能被public、static等修饰符修饰3. 编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class4. 几乎不会使用
匿名内部类
interface IA {
void test();
}
public class test {
// new IA();接口不能实例化
public static void main(String[] args) {
IA a=new IA() {
@Override
public void test () {
System.out.println("重写接口的方法!");
}
};
a.test();