当前位置: 首页 > news >正文

Java中的接口

六. 接口

特性1 - 解决单继承

语法如下

interface A {public default void a() {}
}interface B {public default void b() {}
}// C 从 A, B 两个接口重用方法 a() 和 b()
class C implements A, B {}

解决之前的问题

public class TestInterface1 {public static void main(String[] args) {Duck d = new Duck();d.swim();d.fly();}
}interface Swimmable {default void swim() {System.out.println("游泳");}
}interface Flyable {default void fly() {System.out.println("飞翔");}
}class Duck implements Swimmable, Flyable {}
  • 需要放入接口的方法, 必须加 default 关键字(默认方法)
  • default 方法只能是 public, public 可以省略

特性2 - 接口多态

  1. 用父类型代表子类对象,或者用接口类型来代表实现类对象
  2. 必须发生方法重写
«interface»
E
void e()
F
void e()
G
void e()

看这张图,上面这是接口E,下面这俩类 F、G 实现了接口,他俩以后可以叫做实现类,看一下这种上下级关系就可以知道,它们之间符合向上转型,F,G能够沿箭头向上转换为接口类型,因此能用接口类型代表实现类对象

先来看第一条,接口类型可以代表实现类对象

public class TestInterface2 {public static void main(String[] args) {E[] array = new E[] {new F(),new G()};}
}
interface E {
}
class F implements E {
}
class G implements E {
}

再看第二条,方法重写

public class TestInterface2 {public static void main(String[] args) {E[] array = new E[] {new F(),new G()};for (int i = 0; i < array.length; i++) {E e = array[i];e.e(); // 多态}}
}
interface E {default void e() { System.out.println("e");}
}
class F implements E {@Overridepublic void e() { System.out.println("f");}
}
class G implements E {@Overridepublic void e() {System.out.println("g");}
}
  • 要注意:方法重写时,要求:子类和实现类 方法访问修饰符 >= 父类和接口 方法访问修饰符
  • default 方法的访问修饰符其实是省略了 public,实现类中方法的访问修饰符要 >= public 才不会出错
  • 多态性:
    • 表面调用的是接口的 E.e() 方法
    • 实际会根据 e 的实际类型调用重写方法,即 F.e() 和 G.e() 方法

抽象方法

其实要使用接口多态,更多地是使用一种抽象方法,而非默认方法,所谓抽象方法仅有方法声明,没有方法体代码。

它包含 abstract 关键字,而且也只能是 public 的,平时这俩关键字都可以省略不写

public class TestInterface2 {public static void main(String[] args) {E[] array = new E[] {new F(),new G()};for (int i = 0; i < array.length; i++) {E e = array[i];e.e(); // 多态}}
}
interface E {void e(); // 抽象方法,没有方法体,只能是 public 的,省略了 public abstract
}
class F implements E {@Overridepublic void e() { // 默认System.out.println("f");}
}
class G implements E {@Overridepublic void e() {System.out.println("g");}
}

为啥抽象方法设计为不需要方法体呢?因为你看:

  • 反正多态要求实现类发生方法重写,既然方法重写了,就调用不到接口方法的代码了
  • 既然多态发生时,用不到接口中可能的代码,还不如让方法体空着

另外,抽象方法有个好处:它强制了实现类要实施方法重写,如果实现类没有重写,语法上会报错

特性3 - 接口封装

接口封装的更为彻底

public class TestInterface3 {public static void main(String[] args) {M m = new N(); // 用接口类型代表了实现类对象m.m(); // 只能调用接口中定义的方法}
}interface M {void m(); // public abstract
}class N implements M {public String name;@Overridepublic void m() {System.out.println("m");}public void n() {System.out.println("n");}
}
  • 只能调用到接口中的方法,对实现类中的其它方法,一无所知
  • 接口限制了只能通过方法来使用对象,不能直接访问对象的字段

封装的关键在于,对外隐藏实现细节,接口完美地做到了这一点

经验

  • 在声明方法的参数、返回值,定义变量时,能用接口类型,就用接口类型,有更好的扩展性
http://www.lryc.cn/news/287822.html

相关文章:

  • Linux笔记之bash脚本中的-e、和
  • mapstruct自定义转换,怎样将String转化为List
  • torch.matmul和torch.bmm区别
  • k8s学习(RKE+k8s+rancher2.x)成长系列之概念介绍(一)
  • PHP - Yii2 异步队列
  • leetcode560和为k的子数组
  • 【ProtoBuf】使用指南
  • Buffer Pool
  • jetson-inference----docker内运行分类任务
  • Python脚本之操作Redis Cluster【二】
  • 认识数学建模
  • 计算机工作原理解析和解剖(基础版)
  • 外网ssh远程连接服务器
  • 滴滴基于 Ray 的 XGBoost 大规模分布式训练实践
  • k8s从入门到实践
  • Qt5.12.0 与 VS2017 在 .pro文件转.vcxproj文件
  • 金蝶云星空 ServiceGateway RCE漏洞复现
  • 二叉树的最大深度[简单]
  • [Redis]不同系统间安装redis服务器
  • Unity之动画和角色控制
  • C语言库函数实现字符串转大小写
  • hcip----ospf
  • vue中如何写过滤器
  • c语言-文件的读写操作(下)
  • android学习笔记----SQLite数据库
  • 开发知识点-Flutter移动应用开发
  • 视频尺寸魔方:分层遮掩3D扩散模型在视频尺寸延展的应用
  • openssl3.2/test/certs - 061 - other@good.org not permitted by CA1
  • 如何实现无公网ip远程访问本地websocket服务端【内网穿透】
  • pip清华源怎么换回来