谈谈接口和抽象类有什么区别?

《Java核心技术面试精讲–杨晓峰》学习笔记目录

接口和抽象类的区别

接口
  • 接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到API定义和实现分离的目的。
  • 有一类没有任何方法的接口用作标志,比如Serializable接口就表示这个类可以被序列化
  • 不能实例化;
  • 不能包含任何非常量成员,任何field都是隐含着public static final的意义;
  • 没有非静态方法实现,也就是说要么是抽象方法,要么是静态方法。
  • Java类实现interface使用implements关键词
  • Java 8 以后增加了默认方法。在方法签名前加上default。它可以为接口添加新的方法,而不会破坏已有的接口的实现。
  • Java 8 新增了函数式接口,接口内只含有一个抽象方法。通常使用@FunctionalInterface AnnotationLambda表达式只能用于函数式接口
抽象类
  • 抽象类是不能实例化的类,用 abstract 关键字修饰 class
  • 其目的主要是代码重用。除了不能实例化,形式上和一般的 Java 类并没有太大区别,可以有一个或者多个抽象方法,也可以没有抽象方法。
  • 抽象类大多用于抽取相关 Java 类的共用方法实现或者是共同成员变量,然后通过继承的方式达到代码复用的目的。
  • 继承 abstract class 则是使用 extends 关键词

面向对象基础

基本要素

最后一个示例实在让我有些惊讶,从没注意过这些东西,就将他们全部复制下来了

OOP 原则在面试题目中的分析

我在以往面试中发现,即使是有多年编程经验的工程师,也还没有真正掌握面向对象设计的基本的原则,如开关原则(Open-Close)。看看下面这段代码,改编自朋友圈盛传的某伟大公司产品代码,你觉得可以利用面向对象设计原则如何改进?


public class VIPCenter {
  void serviceVIP(T extend User user>) {
     if (user instanceof SlumDogVIP) {
        // 穷X VIP,活动抢的那种
        // do somthing
      } else if(user instanceof RealVIP) {
        // do somthing
      }
      // ...
  }

这段代码的一个问题是,业务逻辑集中在一起,当出现新的用户类型时,比如,大数据发现了我们是肥羊,需要去收获一下, 这就需要直接去修改服务方法代码实现,这可能会意外影响不相关的某个用户类型逻辑。利用开关原则,我们可以尝试改造为下面的代码:


public class VIPCenter {
   private Map<User.TYPE, ServiceProvider> providers;
   void serviceVIP(T extend User user) {
      providers.get(user.getType()).service(user);
   }
 }
 interface ServiceProvider{
   void service(T extend User user) ;
 }
 class SlumDogVIPServiceProvider implements ServiceProvider{
   void service(T extend User user){
     // do somthing
   }
 }
 class RealVIPServiceProvider implements ServiceProvider{
   void service(T extend User user) {
     // do something
   }
 } 

上面的示例,将不同对象分类的服务方法进行抽象,把业务逻辑的紧耦合关系拆开,实现代码的隔离保证了方便的扩展。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值