你有没有掉进去过这些 抽象类 和 接口 的 “陷阱“

简介: 你有没有掉进去过这些 抽象类 和 接口 的 “陷阱“

一、抽象类和接口选择的 “陷阱”

接口和抽象类

在面向对象中,所有的对象都可以抽象为一个类,类还可以进一步抽取类的共同点变成一个抽象类,也就是说并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类,抽象类是用来描述类的,抽象类使用 abstract 关键字来描述。

抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。

由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。一个抽象类中,可以有 0 个或多个抽象方法,以及 0 个或多个具体方法。

接口在 Java 中是一个抽象类型,是抽象方法的集合,接口通常以 interface 关键字来声明。一个类通过实现接口的方式,从而获取接口中定义的方法。

需要注意的是接口并不是类,类使用 class 关键字描述,接口使用 interface 关键字描述。编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法,接口则包含类要实现的方法。

接口和抽象类的区别

  • 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
  • 接口中不能含有静态代码块以及构造代码块,而抽象类可以。
  • 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
  • 接口中不能有构造方法,抽象类可以,抽象类也可以有main方法,同时可以运行它。
  • 一个类可以实现多个接口,但是只能继承一个抽象类

接口和抽象类的设计

在设计一个类时如何选择 抽象类 和 接口?

image.png

设计实现一个 GigaFactory 类, 对 GigaFactory 的拆分既不能全部是抽象类,也不能全部是抽象接口,比如产能如果定义在接口里面就是一个常量,每个 GigaFactory 工厂的产能是不同的,这样就失去了每个对象的状态信息。

那可以都定义为抽象类吗?

也不能将功能都拆分为抽象类,会导致代码难以维护,这是从代码的灵活性和复杂性考虑的。从语言特性来考虑也不合适,类是对事物的客观抽象,并不是所有的类都具有相同的行为。

可以将共同的属性使用抽象类来表达,比如状态等,而将特有的行为使用接口定义,每个不同的类实现特定的接口。

新建 Maven 项目 abstract-interface-traps,增加 entity 包,定义一个 Factory 抽象类

/**
 * 每个 Factory 最基本的属性
 */
public abstract class Factory {
    protected String address;
    protected Integer productivity;
}
复制代码

定义生产整车业务的接口类 Vehicle

/**
 * 整车业务生产,Model 3、Y、X 等
 */
public interface Vehicle {
    void produceCars();
}
复制代码

定义生产配件的接口类

/**
 * 配件业务生产,电机等
 */
public interface Autoparts {
    void makeParts();
}
复制代码

定义生产太阳能业务的接口类 Energy

/**
 * 太阳能业务
 */
public interface Energy {
    void produceSolarPanels();
}
复制代码

定义一个上海超级工厂类,继承 Factory 类,实现整车业务接口类 Vehicle

public class ShanghaiGigaFactory extends Factory implements Vehicle{
    protected String address = "Shanghai";
    protected Integer productivity = 500000;
    @Override
    public void produceCars() {
    }
}


相关文章
|
3月前
|
存储 Java 开发者
抽象类和接口,你不知道的秘密!Java编程新视角
抽象类和接口,你不知道的秘密!Java编程新视角
38 5
|
3月前
|
设计模式 Java
【惊天揭秘】Java编程绝技大曝光:接口、抽象类、静态类与非静态类的神秘面纱终被揭开!
【8月更文挑战第22天】Java支持面向对象编程,通过接口、抽象类、静态类(如枚举与工具类)及普通类实现设计原则。接口定义行为规范,允许多重继承;抽象类含未实现的抽象方法,需子类完成;静态类常为工具类,提供静态方法;普通类则实例化对象。恰当运用这些结构能提升程序质量。
39 2
|
3月前
|
Java C++ 开发者
"深度剖析!接口VS抽象类、聚合VS组合...这6大OOP谜题,你真的全解开了吗?点击揭秘真相!"
【8月更文挑战第19天】接口与聚合是面向对象编程的关键,对于构建灵活、可扩展的软件系统至关重要。本文澄清六个常见疑惑:接口与抽象类的区别、为何使用接口、聚合与组合的不同、接口的新特性、聚合与继承的关系,以及如何合理选择接口、聚合和继承,助你深刻理解并准确应用这些核心概念。
37 0
|
5月前
|
存储 Java 开发者
Java编程新视角:抽象类和接口,你不知道的秘密!
【6月更文挑战第17天】在Java中,抽象类与接口是抽象概念的关键工具。抽象类是不可实例化的模板,包含抽象和具体方法,适合有层次结构的继承;接口仅含抽象方法,像契约般规定实现类的行为,适用于无关对象间的统一接口。Java类单继承但可多实现接口,增加设计灵活性。理解并巧妙运用二者,能提升代码质量和可维护性。
29 0
2022年 一月19号复盘内容二。(继承 多态 接口 抽象(二)
2022年 一月19号复盘内容二。(继承 多态 接口 抽象(二)
36 0
细谈抽象类
抽象类 1.抽象类是被abstract修饰的类 2.抽象类中的抽象方法 3.抽象类中可以有和普通类一样的成员变量和成员方法 4.抽象类不能被实例化 5.那么抽象类不能被实例化要它有何用???
65 0
|
存储 安全 编译器
【巧妙继承】C++玩转继承的神级技巧
【巧妙继承】C++玩转继承的神级技巧
2022年 一月19号复盘内容二。(继承 多态 接口 抽象(三)
2022年 一月19号复盘内容二。(继承 多态 接口 抽象(三)
40 0
2022年 一月19号复盘内容二。(继承 多态 接口 抽象)(一)
2022年 一月19号复盘内容二。(继承 多态 接口 抽象)(一)
44 0
|
设计模式 算法 Java
Java多态的实现机制是什么,写得非常好!
Java多态的实现机制是父类或接口定义的引用变量可以指向子类或实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实现对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
837 0
Java多态的实现机制是什么,写得非常好!