一、抽象类
抽象类(Abstract Class)是一种不能被实例化的类,用于定义共性行为模板。通过`abstract`关键字声明,可以包含抽象方法(无实现)和具体方法(有实现)。
public abstract class Animal {
// 抽象方法:无实现体
public abstract void run();
// 具体方法:有实现体
public void eat() {
System.out.println("动物在吃东西");
}
}
抽象类的核心特点
-- 构造方法:可以定义构造器,供子类初始化。
-- 成员变量:可以包含实例变量和静态变量。
-- 代码复用:通过继承实现方法复用。
二、接口
接口(Interface)定义了一组行为契约,通过`interface`关键字声明。在Java 8后,接口支持默认方法(`default`)和静态方法。
public interface Flyable {
// 抽象方法(默认public abstract)
void fly();
// 默认方法(Java 8+)
default void glide() {
System.out.println("滑翔中...");
}
}
特点
-- 多实现:一个类可实现多个接口。
-- 无构造器:不能定义构造方法。
-- 行为抽象:定义“能做什么”,而非“是什么”。
接口与抽象类区别
特性 | 抽象类 | 接口 |
继承/实现 | 单继承 | 多实现 |
构造器 | 有 | 无 |
方法类型 | 抽象方法+具体方法 | 抽象方法+默认方法 |
设计目的 | 代码复用+定义模板 | 定义契约行为 |
访问问修饰符 | 方法可为任意访问修饰符 | 默认public,不可为private |
如何选择
抽象类:存在明确继承关系,需要共享代码或状态。
接口:定义多个无关类的共同行为,或者实现多态。
实际应用
假设有一个`Person`类,需支持按年龄或姓名排序。通过接口`Comparator`和抽象类`AbstractList`分别实现。
代码示例
Person定义
public class Person implements Comparable<Person> {
public String name;
public int age;
public double height;
public Person(String name,int age,double height){
this.name = name;
this.age = age;
this.height = height;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", height=" + height +
'}';
}
// 其余构造方法、getter、setter省略
}
排序接口定义
import java.util.Comparator;
// 按年龄排序
Comparator<Person> ageComparator = new Comparator<>() {
@Override
public int compare(Person p1, Person p2) {
return p1.getAge() - p2.getAge();
}
};
// 按姓名排序
Comparator<Person> nameComparator = (p1, p2) ->
p1.getName().compareTo(p2.getName());
main函数
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class SortExample {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("小花", 10, 187.4),
new Person("小蓝", 20, 184.5),
new Person("小黄", 30, 186.7),
new Person("小绿", 40, 189.0)
);
// 按年龄排序
Comparator<Person> ageComparator = Comparator.comparingInt(Person::getAge);
people.sort(ageComparator);
System.out.println("按年龄排序:");
people.forEach(System.out::println);
// 按姓名排序
Comparator<Person> nameComparator = Comparator.comparing(Person::getName);
people.sort(nameComparator);
System.out.println("\n按姓名排序:");
people.forEach(System.out::println);
}
}
输出结果
按年龄排序:
Person{name='小花', age=10, height=187.4}
Person{name='小蓝', age=20, height=184.5}
Person{name='小黄', age=30, height=186.7}
Person{name='小绿', age=40, height=189.0}
按姓名排序:
Person{name='小蓝', age=20, height=184.5}
Person{name='小绿', age=40, height=189.0}
Person{name='小花', age=10, height=187.4}
Person{name='小黄', age=30, height=186.7}
代码详解
- 使用`Comparator.comparingInt`和`Comparator.comparing`方法创建比较器。
- `people.sort()`方法根据传入的比较器对列表进行排序。
- 排序结果通过`forEach`方法输出。