接口和抽象类都是定义类间契约的机制,但接口可多重继承且只含抽象方法,而抽象类仅支持单重继承且可兼含具体方法和属性。接口更注重契约定义,促进代码重用;抽象类则提供部分继承,减少冗余,但更改抽象类时须同步修改子类。实战中,shape 接口定义了图形的面积周长获取方法;square 的抽象类实现了面积计算,其具体子类 specificsquare 则实现了周长计算。
接口和抽象类在 Java 中的异同与优缺点
在 Java 中,接口和抽象类都是用于定义类之间契约的机制。两者之间既有相似之处,也有重大差异。
相似之处
- 接口和抽象类都无法被实例化。
- 它们都包含方法声明,但没有实现。
- 子类必须实现接口或扩展抽象类中的所有抽象方法。
差异
特性 | 接口 | 抽象类 |
---|---|---|
访问修饰符 | 默认是 public | 可以是 public、protected 或 default |
继承 | 可以继承多个接口 | 只能继承一个抽象类 |
实现 | 只能包含抽象方法 | 可以包含抽象方法和具体方法 |
属性 | 只能包含 static 和 final 的常量 | 可以包含属性和方法 |
实例化 | 无法实例化 | 无法实例化 |
实例方法 | 只能包含抽象方法 | 可以包含抽象方法和具体方法 |
优缺点
接口
-
优点:
- 为多个实现提供了一个通用契约。
- 促进代码重用和模块化。
- 支持多重继承。
-
缺点:
- 无法包含具体实现。
- 子类必须显式实现所有接口方法。
抽象类
-
优点:
- 可以包含具体实现,这可以减少代码冗余。
- 提供了一个介于接口和具体类之间的中间选项。
- 支持部分继承,允许子类选择实现哪些方法。
-
缺点:
- 只支持单重继承。
- 如果更改抽象类,需要更改所有子类。
实战案例
定义 Shape 接口:
public interface Shape { double getArea(); double getPerimeter(); }
创建 Square 的抽象类和具体类:
public abstract class Square implements Shape { protected double side; public Square(double side) { this.side = side; } @Override public double getArea() { return side * side; } } public class SpecificSquare extends Square { public SpecificSquare(double side) { super(side); } @Override public double getPerimeter() { return 4 * side; } }
使用 Square 接口:
Shape shape = new SpecificSquare(5.0); double area = shape.getArea(); double perimeter = shape.getPerimeter();
以上就是接口和抽象类在 Java 中的异同与优缺点的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!