一、抽象类和接口的区别
| 特点 | 抽象类 | 接口 |
|---|---|---|
| 关系 | “是一个”的关系(圆形是几何形状的一种) | “能做什么”的关系(微波炉能够加热) |
| 方法 | 可以有抽象方法和具体方法 | 主要是抽象方法,可以有默认方法(default) |
| 变量 | 可以有普通成员变量 | 变量默认是public static final(常量) |
| 继承 | 单继承 | 多实现 |
| 构造器 | 有 | 无 |
| 设计理念 | 代码复用,模板方法模式 | 定义行为,多态 |
1.抽象类
abstract class Shape {private String name;public Shape(String name) {this.name = name;}// 抽象方法,每种形状计算面积的方式不同public abstract double calculateArea();// 具体方法,所有形状共享行为public void displayInfo() {System.out.println("这是一个" + name);System.out.println("面积是: " + calculateArea());}
}class Circle extends Shape {private double radius;public Circle(double radius) {super("圆形");this.radius = radius;}@Overridepublic double calculateArea() {return Math.PI * radius * radius;}
}class Rectangle extends Shape {private double length;private double width;public Rectangle(double length, double width) {super("矩形");this.length = length;this.width = width;}@Overridepublic double calculateArea() {return length * width;}
}public class Main {public static void main(String[] args) {Circle circle = new Circle(3);Rectangle rectangle = new Rectangle(1, 2);// 多态Shape[] shapes = {circle, rectangle};for (Shape s: shapes) {s.displayInfo();}}
}
2.接口
// 定义加热功能
interface Heatable {void heat(); // 默认就是public abstract
}// 定义定时功能
interface Timable {void setTimer(int minuters);// 默认方法default void displayTime() {System.out.println("当前时间已显示");}
}class Microwave implements Heatable, Timable {@Overridepublic void heat() {System.out.println("微波炉正在加热");}@Overridepublic void setTimer(int minuters) {System.out.println("微波炉设置定时" + minuters + "分钟");displayTime();}
}class Kettle implements Heatable {@Overridepublic void heat() {System.out.println("水壶正在加热");}
}public class Main {public static void main(String[] args) {Microwave microwave = new Microwave();Kettle kettle = new Kettle();Heatable[] heatables = {microwave, kettle};for (Heatable h: heatables) {h.heat();}// Timable[] timables = {microwave, kettle}; 编译报错,kettle没有实现Timable,其对象无法指向Timable的引用}
}
二、访问权限
| 类型 | 方法种类 | 允许的访问修饰符 | 说明 |
|---|---|---|---|
| 抽象类 | 抽象方法 | public,protected,默认 | 不能是private,因为抽象方法要重写 |
| 抽象类 | 普通方法 | 所有权限 | 包括private |
| 接口 | 抽象方法 | 只能是public | 默认就是public abstract |
| 接口 | 默认方法 | 只能是public | Java 8+ |
| 接口 | 静态方法 | 只能是public | Java 8+ |
| 接口 | 私有方法 | 只能是private | Java 9+ |
三、总结
- 抽象类:半成品要继承,填空白才能用。像普通类一样自由,但是抽象方法不能使用private
- 接口:说明书定规矩,多功能随便用。以前只能公开public,Java9以后可以有私有方法private