为什么会有接口:
java的继承问题:一个子类只能继承一个父类( java的单继承)
接口: 一个子类可以实现多个接口
接口本身是抽象的,在其中的方法是抽象方法,变量是抽象
特征
- 接口用interface实现,子类继承用implements
- 接口中所有的成员变量都是由public static final修饰的(公有的静态常量)

- 接口中所有的方法默认都是由public abstract修饰的(抽象方法)
- 接口当中也是没有构造器的,不能被实例化
- 接口当中的方法全部都是抽象方法,和抽象类不一样
- 接口和接口之间可以互相继承(继承的本质:代码的复用) 用extends,任何实现子接口的类都需要实现父接口和子接口内的方法(抽象的)
接口是对方法的抽象, 子类必须实现父类的抽象方法

排序:实现comparable接口,重写里面的抽象方法,实现自定义排序。
Person 与compareTo里面的类型对应
从小到大:(从大到小的话反过来o.age-age)


Arrays.sort(数组名)

Arrays.sort() 是一个通用的排序方法,用于对数组进行排序。它的实现依赖于对象的比较能力。具体来说:
- 如果数组中的元素是基本数据类型(如 int[]、double[] 等),Arrays.sort() 会直接比较它们的值。
- 如果数组中的元素是对象类型(如 Integer[]、String[] 或自定义类的数组),Arrays.sort() 会检查这些对象是否实现了 Comparable 接口。
接口本身不能被实例化,但可以作为引用类型来引用实现了该接口的对象。Comparable[]。要求这个类型必须实现Comparable接口
Comparable[] 是一个数组,它的元素类型是Comparable 接口。这意味着这个数组可以存储任何实现了Comparable 接口的对象。例如:
Comparable[] arr = {new Integer(5), new String("abc"), new Person("Alice", 25)};
在这个数组中:
- Integer 实现了 Comparable 接口。
- String 实现了 Comparable 接口。
- Person(假设它实现了 Comparable 接口)也实现了 Comparable 接口。
虽然这些对象是不同类型,但它们都实现了 Comparable 接口,因此可以存储在同一个 Comparable[] 数组中。


接口和抽象类的区别?
抽象类一般作为 父类实现。
抽象类之所以被提出来,原因之一是: 子类会重写父类的方法和变量
抽象类之所以被提出来,原因之二是: 将子类当中共性的代码进行提取
抽象类只需要做 方法的定义,不需要实现。只要继承抽象类, 子类必须实现父类(抽象类)中的抽象方法


抽象类的特点:
- 由 abstract 修饰的类叫抽象类,由 abstract 修饰的方法叫抽象方法
- abstract修饰的抽象方法,不在抽象类当中去实现,更多的作为子类必须实现的方法的定义
- 抽象类当中才能有抽象方法,普通类当中不能有抽象方法
- 抽象类当中不一定全是抽象方法,也可以使用普通方法,普通方法可以不用重写
- 抽象类不能被实例化(不能创建它的对象),原因在于没有构造器
- final 不能和 abstract 同时使用:final关键字作用在类上面不能被继承,final关键字作用在方法上面不能被重写,会冲突
- 抽象方法不能使用static,static是针对类层次,抽象方法是针对对象层次的,所以不能一起使用。
- 子类继承抽象类后,如果不想实现抽象类中的抽象方法,那么子类必须是个抽象类
- 抽象类一定是父类
public class OuterClass {static abstract class AbstractStaticInnerClass {static void staticMethod() {System.out.println("Static method in abstract static inner class");}abstract void abstractMethod();}public static void main(String[] args) {AbstractStaticInnerClass.staticMethod(); // 调用静态方法ConcreteStaticInnerClass concrete = new ConcreteStaticInnerClass(); // 创建静态内部类的实例concrete.abstractMethod();}
}class ConcreteStaticInnerClass extends OuterClass.AbstractStaticInnerClass {void abstractMethod() {System.out.println("Implemented abstract method");}
}