当前位置:网站首页>接口定义与实现
接口定义与实现
2022-08-10 10:44:00 【抬眼远望】
接口
使用关键字interface来定义一个接口。接口的定义和类的定义很相似,分为接口声明和接口体
接口声明
interface 接口的名字
接口体
接口体中包含常量的声明(没有变量)和抽象方法两部分。接口体中只有抽象方法,没有普通的方法,而且接口体中所有的常量的访问权限一定 都是public, 而且是static常量(允.许省略public、final 和static 修饰符),所有的抽象方法的访问权限一定都是public ( 允许省略public abstract修饰符)
接口特点:
1.接口没有构造方法
2.接口不能实例化,但是可以将接口的引用指向其实现类实例
3.一个接口不能实现另一个接口,但可以继承多个其他接口
4.一个类必须实现接口抽象方法(implements),除非这个类也是抽象类.即当这个类是接口的实现类,这个实现类需要重写接口所有的抽象方法,否则这个实现类需要被定义为抽象类
5.实现类可以实现多个接口
使用 implements关键字执行接口、多个接口使用逗号隔开
6.接口中的变量都是静态常量(默认用public static final)必须显式初始化
7.接口的所有方法都是抽象方法 (默认用public abstract修饰)
接口是一种约定
生活中,我们使用的两相电源插座,规定了:
两个接头间的额定电压
两个接头间的距离
接头的形状
接口是一种约定
有些接口只有名称
面向接口编程
程序设计时面向接口的约定而不考虑具体实现
注意:
接口中的方法在定义好了之后就不要轻易的去修改
因为修改接口中的方法,接口的实现类都要对修改的方法重新操作,非常麻烦
一个类要想增加一个功能,只需要新建一个接口,然后让这个类实现这个新建的接口,就可以用这个接口定义的功能
抽象类vs接口
相同点
代表系统的抽象层
都不能被实例化
都能包含抽象方法
用于描述系统提供的服务,不必提供具体实现
不同点
在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法
抽象类便于复用,接口便于代码维护
一个类只能继承一个直接的父类,但可以实现多个接口
使用原则
接口做系统与外界交互的窗口
接口提供服务
接口本身一旦制定,就不允许随意修改
抽象类可完成部分功能实现,还有部分功能可作为系统的扩展点
案例:
接口
package cn.bdqn.demo03;
public interface USB {
//定义两个方法
void electric();
void data();
}
实现类
package cn.bdqn.demo03;
public class USBFengShan implements USB {
@Override
public void electric() {
System.out.println("风扇获取电能,风扇开始运作.....");
}
@Override
public void data() {
}
public void qqq(){
System.out.println("我是风扇中独有的方法。");
}
}
package cn.bdqn.demo03;
public class USBMouse implements USB {
@Override
public void electric() {
System.out.println("鼠标获取电能,鼠标开始运作....");
}
@Override
public void data() {
System.out.println("获取数据传输能力,开始传输数据....");
}
public void test(){
System.out.println("我是鼠标类中独有方法。");
}
}
测试类
package cn.bdqn.demo03;
public class Test {
public static void main(String[] args) {
// 接口不能实例化
//USB usb = new USB();
//直接通过接口的实现类构造方法创建对象
USBFengShan usbf = new USBFengShan();
usbf.electric();
usbf.data();
System.out.println("----------------");
//通过向上转型创建实现类对象
//向上转型: 父类的引用指向实现类的实例
USB usb = new USBFengShan();
usb.electric();
usb = new USBMouse();
usb.data();
// usb = new USBFengShan();
// usb.data();
//接口的引用不能调用实现类中的独有方法,需要进行向下转型
//usb.test();
//在向下转型过程中,容易出现类型转换异常(ClassCastException)
if(usb instanceof USBFengShan){
USBFengShan usbs =(USBFengShan) usb;
usbs.qqq();
}else if(usb instanceof USBMouse){
USBMouse usbm = (USBMouse) usb;
usbm.test();
}
}
}
边栏推荐
- bus event bus use
- JWT 实现登录认证 + Token 自动续期方案
- GPU加速Pinterest推荐模型,参数量增加100倍,用户活跃度提高16%
- "MySQL Advanced Chapter" 6. Principles of index creation and design
- 网络文化经营许可证
- Memory problems difficult to locate, it is because you do not use ASAN
- Gartner再次重申了“数据编织”的重要价值
- HCIP ---- VLAN
- [Azure Cloud] What is the difference between a service endpoint and a private link?point of view (1)
- 第3章-线性方程组(3)
猜你喜欢
随机推荐
HCIP ---- VLAN
从产品角度看 L2 应用:为什么说这是一个游乐场?
Will SQL and NoSQL eventually converge?
Unsafe的一些使用技巧
AUTOCAD——减少样条曲线控制点数、CAD进阶练习(三)
关于“码农”的一点自嘲解构
2022.8.8-----leetcode.761
CodeChef STMRRG String Merging (dp)
Three-phase 380V rectified voltage
MongoDB数据库笔记
chart.js水平柱状图插件
自动化测试及Selenium
开发模式对测试的影响
Store limited time seckill function system
GPU加速Pinterest推荐模型,参数量增加100倍,用户活跃度提高16%
什么是抽象类
网络文化经营许可证
chart.js horizontal column chart plugin
网络安全笔记5——数字签名
Redis(六)——Redis6的事务和锁机制(未完成,待补)