难度
初级
学习时间
20分钟
适合人群
零基础
开发语言
Java
开发环境
- JDK v11
- IntelliJ IDEA v2018.3
提示
本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
1.接口与字段
我们在接口中定义几个字段试试。
演示:
请编写一个接口,在接口体里面定义几个字段,再编写一个实现类,试着去访问接口中的字段。
请观察程序运行结果。
代码:
Shape接口:
Circle类:
Main类:
结果:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/lab/Shape.javaError:(11, 21) java: 需要=Error:(16, 22) java: 需要=
为什么width和height两个字段需要“=”,而ID不需要呢?
好,我们就给Shape接口体里面的width和height字段加上“=”:
结果:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/lab/Shape.javaError:(11, 24) java: 非法的表达式开始Error:(16, 25) java: 非法的表达式开始
我们知道“=”是赋值符号,写上“=”符号一定要带上具体的值:
结果:
这下程序运行正常了。回过头来,我们再来看width和height这个两个字段为什么一定要初始化?再想想什么样的变量在声明的时候就必须初始化?答案只有一个:常量。只有在声明常量的时候,才必须初始化。
2.接口与常量
接口可以包含常量声明。
从上一小节中我们得知接口中声明的字段都是常量,所以下面就直接定义常量。
演示:
请编写一个接口,然后在接口体里面定义一个常量。我们试着去使用接口名去访问它。
请观察程序运行结果。
代码:
Shape接口:
Circle类:
Main类:
结果:
从运行结果来看,程序完全没有问题。
我们试过通过接口访问常量试试,看能访问不。
修改Circle类:
结果:
从运行结果来看,也没有问题。
ID被定义为static类型的,可以通过接口名访问,这很正常。但是,奇怪的是width和height没有被定义为static类型,为什么也可以通过接口名访问?可以访问那就说明width和height同ID一样,也是static类型。这个问题也是下面要讲解到的内容。
3.接口中定义的所有常量值都是隐式public,static和final
接口中定义的所有常量值都是隐式public,static和final,我们可以省略这些修饰符。
原来,我们可以通过接口名直接访问到width和height是这个原因。接下来,我们试试将public、static和final关键字都去掉看看。
演示:
请编写一个接口,接口体里面定义常量。再编写一个实现类,在其构造方法里面访问接口体里面的常量。
请观察程序运行结果。
代码:
Shape接口:
Circle类:
Main类:
结果:
我们将public、static、final关键字去掉以后,再运行程序,程序依然正常。说明在接口中定义常量直接写数据类型和值即可,关键字编译器会自动帮我们加上。
4.多继承接口中的常量
因为接口中常量是static的,所以它属于接口,直接用接口名调用即可。
演示:
请编写多个接口,让其一个接口继承其他接口,然后再编写一个实现类,实现其那个继承的接口。
每一个接口中定义一个数据类型不同,常量名相同和常量值不同的常量。
请观察程序运行结果。
代码:
Computable接口:
Drawable接口:
Shape接口:
Circle类:
Main类:
结果:
各自调用各自接口里面的常量,不会有任何问题。
下面,我们再试试另外一种情况。
演示:
请编写多个接口,让其一个接口继承其他接口,然后再编写一个实现类,实现其那个继承的接口。
每一个接口中定义一个数据类型相同,常量名相同和常量值不同的常量。
请观察程序运行结果。
代码:
Computable接口:
Drawable接口:
Shape接口:
Circle类:
Main类:
结果:
从运行结果来看,程序没有任何问题。即使三个接口定义的常量数据类型相同和常量名也相同的情况下,而且直接访问message常量是Shape接口中的,因为实现类只能访问被实现的接口里面的常量。
注意
未声明为default或static的接口中的方法是隐式抽象的,因此abstract修饰符不与接口方法一起使用(可以使用,但不需要)。
总结
- 在Java编程语言中,接口是类似于类的引用类型,它只能包含常量,方法签名,默认方法,静态方法和嵌套类型。 方法体仅适用于默认方法和静态方法。 接口无法实例化 - 它们只能由类实现或由其他接口扩展。
- 接口体可以包含抽象方法,默认方法和静态方法。接口中的抽象方法后跟分号,但没有大括号(抽象方法不包含实现)。默认方法使用默认修饰符定义,静态方法使用static关键字定义。接口中的所有抽象,默认和静态方法都是隐式公共的,因此我们可以省略public修饰符。
- 此外,接口可以包含常量声明。接口中定义的所有常量值都是隐式public,static和final,我们可以省略这些修饰符。
- 接口可以扩展其他接口,就像类子类或扩展另一个类一样。但是,虽然类只能扩展另一个类,但接口可以扩展任意数量的接口。接口声明包括它扩展的所有接口的逗号分隔列表。
- 未声明为default或static的接口中的方法是隐式抽象的,因此abstract修饰符不与接口方法一起使用(可以使用,但不需要)。
- 接口的访问修饰符只能是public和默认的访问修饰符。
至此,Java中接口与常量相关内容讲解先告一段落,更多内容请持续关注。
附:字段学习资料
答疑
如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。
上一章
下一章
“全栈2019”Java第六十三章:接口与抽象方法详解
学习小组
加入同步学习小组,共同交流与进步。
- 方式一:关注头条号Gorhaf,私信“Java学习小组”。
- 方式二:关注公众号Gorhaf,回复“Java学习小组”。
全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!