java基础之抽象类、接口
学习过抽象类和接口后,这两个概念一直傻傻分不清楚,抽象类和接口声明的方法都不实现,有时候对它们的用法会混淆,所以到底该什么时候用抽象类,什么时候用接口呢?接下来做一个详细的区别说明
抽象类
abstract关键字与抽象类
abstract(抽象)可以用于修饰一个类,方法;被abstract修饰类成为抽象类,被abstract修饰方法,称之为抽象方法。抽象方法只能出现在抽象类或者接口中。
抽象类Animal
抽象类Cat可以继承抽象类Animal ,也可以声明抽象方法
讯享网
类PetCat继承抽象类Cat ,里面的方法需要重写才可以实现
为什么需要抽象类
在实际开发中,对于某些需求具体的实现不确定时,可以将这些需求对应的功能定义为抽象方法,等待后期子类进行实现,从而提高程序的扩展性。
抽象类特点
- 抽象类中可以包含普通类的一些特性(属性,方法,构造器)
- 抽象类中除了包含一些已实现的方法外还包含抽象方法(未实现)
- 抽象类存在构造器,但是不允许被实例化
- 抽象类一般由子类继承,但是子类继承了抽象类之后就必须实现抽象方法(除非子类也是抽象类)
- 抽象类也可以继承其他抽象类
- 如果子类继承了多个抽象类(多重继承) 则子类必须实现所有抽象类中未实现的方法
例题
有一个抽象类里面包含两个方法,分别用于计算图形的面积和图形的周长,请实现对于不同图形的面积和周长计算(三角形,矩形,圆形)?
Shape类(抽象类)
讯享网
三角形 Tran类
矩形 Rect类
圆形 Round类
测试类Test
设计模式之——模板方法
思考:
在银行的业务中,对于利息的计算有不同的计算规则:
对于定期账户,基准年利率为4.0%
对于活期账户,基准年利率为2.0%
利率的计算有不同的计算方式
利息 = 本金 * 利率;
根据以上信息,请问如何设计对应的类完成利息的计算,要求利率需要通过方法获取?
定义算法的实现骨架,但是不具体实现,通过不同的子类实现不同的计算方法,从而获取模板方法的不同结果,比如银行业务:银行计算利息,都是利率乘以本金和存款时间,但各种存款方式计算利率的方式不同,所以,在账户这个类的相关方法里,只搭出算法的骨架,但不具体实现。具体实现由各个子类来完成。
例如:
Account类(抽象类)
FixedAccount(定期账户)
ActiveAccount(活期账户)
TestAccount(测试类)
通过以上描述大家应该可以了解抽象类到底是什么了吧

接下来介绍接口
接口
接口(interface)是一种特殊的抽象类,本质上不是一个类,里面只能包含常量和方法的定义(不允许实现),接口就是一套未实现方法的集合。
声明语法
[修饰符] <interface> 接口名称{
[常量定义]
[抽象方法的定义]
}
例如
从以上表现来看,接口中不存在像普通类一样的属性,以及普通方法,因此接口实际上就是一套标准,既然是标准,那就必然存在实现,java中的类可以实现多个接口,从而弥补了类只能单继承的缺点。
实现类
并且接口也允许有多个子类实现
实现类2
同时java中的类可以实现多个接口
接口2
实现类3
如果一个子类实现了多个接口,那么这个子类就必须实现所有的抽象方法(除非这个子类是抽象类).
注意事项:
- 接口中只能存在常量和抽象方法(JDK1.8以前)
- 接口允许继承接口,并且能多继承
- 接口不允许继承任何类(包括抽象类)
- 接口允许有多个子类实现,并且子类可以同时实现多个接口
- 接口不属于类,因此不存在构造器,所以也无法实例化
接口(标准)和抽象类(类)的区别
- 接口通常表示对行为(动词,或形容词)的抽象;抽象类一般为对具备相同的属性的类(名词)的抽象
- 接口中只允许常量和抽象方法;抽象类中具备普通的类所有特征,同时也支持抽象方法
- 接口允许多实现,接口允许继承多个接口;抽象类只能单继承
- 接口不存在构造器,无法实例化;抽象类虽然存在构造器,但是也无法实例
JDK8基于接口的新特性
JDK版本更新迭代后新版本的JDK中对于接口新增很多新特性,比如:接口默认方法,静态方法,函数式接口等。
默认方法
某些情况下,可能实现类只需要对于接口中的部分方法实现而非所有方法,因此在这种需求下JDK新增了默认方法的设定,将一些实现类只需选择性实现的方法定义为default方法,这样一来,这些子类(实现类)就可以不一定实现,例如:
以上接口中updateCname和delete方法为默认方法,因此,子类可以无需实现这两个方法,如下:
这种操作,是JDK中一种兼容性的解决方案。
接口静态方法
JDK中除了对接口新增默认方法外,还新增接口的静态方法,即在接口直接将方法定义为静态的已实现方法,这样一来,就无需创建接口的实现类来调用,直接通过接口名.方法()即可调用,大大提高方法调用的便利性.
函数式接口(@FunctionalInterface)与lambda表达式
所谓函数式接口是JDK8中新增的一种概念,表名一个接口中只存在一个未实现方法(可以包含默认方法,静态方法和从Object中继承的方法)
@FunctionalInterface是注解,用于检查接口是否只包含一个未实现的方法。
lambda表达式
实际应用
注意事项:
lambda表达式只能适用函数式接口
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/10364.html