难度
初级
学习时间
30分钟
适合人群
零基础
开发语言
Java
开发环境
- JDK v11
- IntelliJ IDEA v2018.3
提示
本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
1.接口与抽象方法
接口体可以包含抽象方法。
演示:
请编写一个接口,接口体里面声明一个抽象方法。再编写一个实现类,实现其抽象方法。
请观察程序运行结果。
代码:
Shape接口:
Circle类:
Main类:
结果:
从运行结果来看,符合预期结果。
2.接口中的所有抽象态方法都是隐式公共的和抽象的
接口中的所有抽象态方法都是隐式公共的和抽象的,因此我们可以省略public和abstract修饰符。
我们来试试去掉public和abstract修饰符看看。
演示:
请编写一个接口,接口体里面有一个抽象方法。再编写一个实现类,实现其抽象方法。
请观察程序运行结果。
代码:
Shape接口:
Circle类:
Main类:
结果:
从运行结果来看,符合预期结果。
省略了public和abstract修饰符让程序看起来更加的简洁。
3.实现多继承接口中的抽象方法
多继承接口中抽象方法所有都需要实现。
演示:
请编写多个接口,让其一个接口继承其他接口,然后再编写一个实现类,实现其那个继承的接口。
请观察程序运行结果。
代码:
Computable接口:
Drawable接口:
Shape接口:
Circle类:
Main类:
结果:
从运行结果来看,完全正确。Circle类也实现了所有接口中的抽象方法。
4.多继承接口中多样的方法签名
当多继承接口中,有同方法名不同参数和不同返回值情况,怎么办?我们来一起看看。
演示:
请编写多个接口,让其一个接口继承其他接口,然后再编写一个实现类,实现其那个继承的接口。
每一个接口体中方法返回值类型一样,方法名一样,参数列表不同。
请观察程序运行结果。
代码:
Computable接口:
Drawable接口:
Shape接口:
Circle类:
Main类:
结果:
从运行结果来看,程序运行正常。方法返回值相同,方法名相同,方法参数列表不同形成方法重载,所以三个抽象方法都存在,都被实现。
下面再换一种情况。
演示:
请编写多个接口,让其一个接口继承其他接口,然后再编写一个实现类,实现其那个继承的接口。
每一个接口体中方法返回值类型不一样,方法名一样,参数列表相同。
请观察程序运行结果。
代码:
Computable接口:
Drawable接口:
Shape接口:
Circle类:
Main类:
结果:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/lab/Circle.javaError:(6, 8) java: lab.Circle不是抽象的, 并且未覆盖lab.Drawable中的抽象方法say(java.lang.String)Error:(15, 19) java: lab.Circle中的say(java.lang.String)无法实现lab.Computable中的say(java.lang.String) 返回类型java.lang.String与int不兼容/Users/admin/Workspace/Java/Hello/src/lab/Shape.javaError:(6, 8) java: 类型 lab.Computable 和 lab.Drawable 不兼容; 两者都定义了 say(java.lang.String),但却带有不相关的返回类型Error:(11, 12) java: lab.Shape中的say(java.lang.String)与lab.Computable中的say(java.lang.String)冲突 返回类型java.lang.String与int不兼容
程序运行出现问题,我们一条一条来看。
首先是“Error:(6, 8) java: lab.Circle不是抽象的, 并且未覆盖lab.Drawable中的抽象方法say(java.lang.String)”:
我们Circle实现了Shape接口,而Shape接口却继承了Drawable接口和Computable接口,Drawable接口和Computable接口里面都有say方法,Circle实现类却只实现了Shape接口中的say方法,所以就报了“Error:(6, 8) java: lab.Circle不是抽象的, 并且未覆盖lab.Drawable中的抽象方法say(java.lang.String)”错误。
再来看“Error:(15, 19) java: lab.Circle中的say(java.lang.String)无法实现lab.Computable中的say(java.lang.String) 返回类型java.lang.String与int不兼容”错误:
Computable接口中的say方法返回值是int,而我们实现类Circle里面实现方法say的返回值却是String,int当然和String不兼容,于是就报了上述错误。
接着,我们再来看Shape接口中的错误,第一个“Error:(6, 8) java: 类型 lab.Computable 和 lab.Drawable 不兼容; 两者都定义了 say(java.lang.String),但却带有不相关的返回类型”错误:
继承中的两个接口定义了相同方法签名却不同方法返回值,这是不可以的。
同理,下一个错误也是一样的“Error:(11, 12) java: lab.Shape中的say(java.lang.String)与lab.Computable中的say(java.lang.String)冲突 返回类型java.lang.String与int不兼容”。
所以,请大家在以后定义接口的时候尽量避免定义重复方法。
注意
未声明为default或static的接口中的方法是隐式抽象的,因此abstract修饰符不与接口方法一起使用(可以使用,但不需要)。
总结
- 在Java编程语言中,接口是类似于类的引用类型,它只能包含常量,方法签名,默认方法,静态方法和嵌套类型。 方法体仅适用于默认方法和静态方法。 接口无法实例化 - 它们只能由类实现或由其他接口扩展。
- 接口体可以包含抽象方法,默认方法和静态方法。接口中的抽象方法后跟分号,但没有大括号(抽象方法不包含实现)。默认方法使用默认修饰符定义,静态方法使用static关键字定义。接口中的所有抽象,默认和静态方法都是隐式公共的,因此我们可以省略public修饰符。
- 此外,接口可以包含常量声明。接口中定义的所有常量值都是隐式public,static和final,我们可以省略这些修饰符。
- 接口可以扩展其他接口,就像类子类或扩展另一个类一样。但是,虽然类只能扩展另一个类,但接口可以扩展任意数量的接口。接口声明包括它扩展的所有接口的逗号分隔列表。
- 未声明为default或static的接口中的方法是隐式抽象的,因此abstract修饰符不与接口方法一起使用(可以使用,但不需要)。
- 接口的访问修饰符只能是public和默认的访问修饰符。
至此,Java中接口与抽象方法相关内容讲解先告一段落,更多内容请持续关注。
附:接口和抽象方法学习资料
答疑
如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。
上一章
下一章
“全栈2019”Java第六十四章:接口与静态方法详解
学习小组
加入同步学习小组,共同交流与进步。
- 方式一:关注头条号Gorhaf,私信“Java学习小组”。
- 方式二:关注公众号Gorhaf,回复“Java学习小组”。
全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!