这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战
抽象类
抽象类不允许被实例化,只能被继承,所以我们不能通过 new 来创建抽象类的实例。
抽象类可以包含属性和方法,方法必须要有抽象方法,只有含有抽象方法的类才叫做抽象类。
子类继承抽象类,必须实现抽象类中所有的抽象方法。
接口
抽象类本身也是类,只不过是更加抽象的类,而接口就更加牛逼了,比抽象类还要抽象,很多地方都会说抽象类和接口的区别在于 is-a 和 has-a 的区别,大家自己感受一下即可。
接口可以理解为是一种协议,一种标准,我只负责定义,不负责实现,然而在 Java 8 接口中也能定义 default 的方法了。
像我们常见用 repository 层,就会定义一套接口,而 service 层在使用的时候不需要知道具体的实现是怎么样的,底层的数据库是 MySQL,Oracle ,甚至是 Redis 这些都不重要。
抽象类和接口的使用
抽象类在使用的时候需要注意,因为所有的子类都需要实现其所有的抽象方法,所以在定义的时候,一定要保证是父子类的关系,且抽象类中的方法不易过多,而接口的定义,就是为了定义某种标准,可能是数据交互的标准,子类需要实现接口就代表子类拥有了某种能力。
Java 中虽然不支持多重继承,但是我们可以通过多重实现来达到相似的功能。抽象类多用于模板方法,对模板中某一部分进行抽象,而接口则是完全的抽象。
抽象类的应用 - 模板设计模式
模板设计模式就是指固定的套路 。假如你有如下需求 ,计算代码的运行时间 。套路就是记录开始时间 ,运行方法 ,记录结束时间 ,最后一减得出结果 。可以像这样实现 。
1 | csharp复制代码public abstract class SupClass { |
接口的应用 - 工厂模式
在工厂模式中 ,我们在创建对象时不会对客户端暴露创建逻辑 ,并且是通过使用一个共同的接口( Car )来指向新创建的对象 。这就是一种创建类的方法 。主要体现在工厂中获取对象的方法的内部逻辑 。像下面示例中的 getCar 方法 。
1 | typescript复制代码public interface Car { |
总结
本文转载自: 掘金