java中的接口和抽象类

java的三大特性:封装、继承、多态。

问题一:为什么要设计接口和抽象类?

接口:

 官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

 接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成。接口是解决Java无法使用多继承的一种手段,但是接口在实际中更多的作用是制定标准的。或者我们可以直接把接口理解为100%的抽象类,既接口中的方法必须全部是抽象方法。(JDK1.8之前可以这样理解)

(1)接口体现了程序设计的多态和高内聚低耦合的设计思想。默认的编码规范。使用接口可以达到一定程度的解耦合作用。

(2)接口的存在也是为了弥补类无法多继承的缺点

 

问题二:既然有了接口为什么还要设计抽象类?

 最简单的场景,接口A有三个实现类,A1,A2,A3,但是A1,A2,A3的实现方法里面有一个共同的操作(比如查询所有用户保存到map)但是如果在每个实现类中都实现这个逻辑,那么这种做法明显不符合代码重用的规则,正确的做法是,写一个抽象类C,将共同的操作写在C中,然后让A1,A2,A3实现A的同时继承C,B1 extends C implements A 这样就做到了封装,提高了代码的复用性。

问题三:jdk1.8接口新特性:

1. 可以有静态方法,但必须去实现它

interface demo{
    static int d(){
        return 0;
    }
}

由于java可以同时实现多个接口(接口与接口之间使用逗号隔开),如果一个类同时实现了多个接口,而这几个接口中同时存在同名、同参数的静态方法,使用实现类去调用接口中的静态方法,将不知道具体调用哪一个。所以,java拒绝使用“实现类.接口静态方法”,只能使用“接口.接口静态方法”去访问。由于在实现类中也可以定义与接口中同名同参的静态方法,但是不能用@Override修饰,所以接口中的静态方法不能被重写


2. 可以有default方法,且必须去实现它

interface demo{
    default int d(){
        return 0;
    }
}

实现类可以去重写接口中default方法,但必须显式加上public,去掉default,因为default关键字只能出现在接口中

理解: 所以说这个default方法是所有的实现类都不需要去实现的就可以直接调用,那么比如说jdk的集合List里面增加了一个sort方法,那么如果定义为一个抽象方法,其所有的实现类如arrayList,LinkedList等都需要对其添加实现,那么现在用default定义一个默认的方法之后,其实现类可以直接使用这个方法了,这样不管是开发还是维护项目,都会大大简化代码量。

也就是说对于一个经常被使用到的方法,将其直接在父接口中定义,如果是不允许被子类改变的则定义为static ,如果允许改变定义为default,子类中可以直接用也可以根据自己的需求进行修改这样不管是开发还是维护项目,都会大大简化代码量。否则父接口的这样一个经常用到的方法,因为该方法一定会在超多个子类中被实现,所以工作量难以想象。


 

抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。

抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。

Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:

  • 接口中所有的方法都是抽象的,而抽象类则可以同时包含抽象类和非抽象的方法。
  • 类可以实现很多接口,但是只能继承一个抽象类。
  • java类是单继承的,但接口是多继承的。即一个接口可以继承多个接口。(不允许类多继承的主要原因是,如果A可以继承B和C两个类,B和C中同时有一个D方法,A如何决定继承哪一个呢? 但接口不存在这样的问题,因为接口全是抽象方法继承谁的都无所谓,所以接口可以继承多个接口)
  • 类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
  • 抽象类可以在不提供接口方法实现的情况下实现接口。
  • Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
  • Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
  • 接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值