“全栈2019”Java第六十四章:接口与静态方法详解

286 阅读7分钟
原文链接: www.toutiao.com

难度

初级

学习时间

30分钟

适合人群

零基础

开发语言

Java

开发环境

  • JDK v11
  • IntelliJ IDEA v2018.3

提示

本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。

1.接口与静态方法

接口体可以包含静态方法。方法体适用于静态方法。 静态方法使用static关键字定义。

静态方法定义:

“全栈2019”Java第六十四章:接口与静态方法详解

演示:

请编写一个接口,接口体里面声明一个静态方法。直接使用接口名调用静态方法。

请观察程序运行结果。

代码:

Shape接口:

“全栈2019”Java第六十四章:接口与静态方法详解

Main类:

“全栈2019”Java第六十四章:接口与静态方法详解

结果:

“全栈2019”Java第六十四章:接口与静态方法详解

从运行结果来看,符合预期结果。

2.接口中的所有抽象,默认和静态方法都是隐式公共的

接口中的所有抽象,默认和静态方法都是隐式公共的,因此我们可以省略public修饰符。

我们来试试去掉public修饰符看看。

演示:

请编写一个接口,接口体里面声明一个静态方法。直接使用接口名调用静态方法。

请观察程序运行结果。

代码:

Shape接口:

“全栈2019”Java第六十四章:接口与静态方法详解

Main类:

“全栈2019”Java第六十四章:接口与静态方法详解

结果:

“全栈2019”Java第六十四章:接口与静态方法详解

从运行结果来看,符合预期结果。

省略了public修饰符让程序看起来更加的简洁。

下面我们来看看接口中static方法和哪些关键字可以搭配,在开始之前我们先来看看static、final、abstract三个关键字直接的搭配情况。

3.普通类中static、final搭配情况

演示:

请编写一个普通类,里面定义一个同时是static和final的方法。

请观察程序运行结果。

代码:

Circle类:

“全栈2019”Java第六十四章:接口与静态方法详解

Main类:

“全栈2019”Java第六十四章:接口与静态方法详解

结果:

“全栈2019”Java第六十四章:接口与静态方法详解

4.抽象类中static、final、abstract搭配情况

演示:

请编写一个抽象类,里面定义一个同时是static、final和abstract的方法。

请观察程序运行结果。

代码:

Circle类:

“全栈2019”Java第六十四章:接口与静态方法详解

Main类:

“全栈2019”Java第六十四章:接口与静态方法详解

结果:

“全栈2019”Java第六十四章:接口与静态方法详解

错误信息:

“全栈2019”Java第六十四章:接口与静态方法详解

文字版:

/Users/admin/Workspace/Java/Hello/src/lab/Circle.javaError:(11, 39) java: 非法的修饰符组合: abstract和static

从运行结果来看,abstract关键字和static关键字不能同时出现,因为静态方法不能被重写,也就意味着,抽象静态方法没法得到实现,所以abstract关键字和static关键字不能同时出现。那我们分别去掉它们试试。首先是去掉,abstract关键字:

“全栈2019”Java第六十四章:接口与静态方法详解

结果:

“全栈2019”Java第六十四章:接口与静态方法详解

从运行结果来看,在抽象类里面声明一个同时用static和final修饰的方法是可以的。我们再来试试去掉static加上abstract关键字:

“全栈2019”Java第六十四章:接口与静态方法详解

结果:

“全栈2019”Java第六十四章:接口与静态方法详解

错误信息:

“全栈2019”Java第六十四章:接口与静态方法详解

文字版:

/Users/admin/Workspace/Java/Hello/src/lab/Circle.javaError:(11, 32) java: 非法的修饰符组合: abstract和final

从运行结果来看,程序出错了。首先,我们知道被final修饰的方法是不能被子类重写的,这也就意味着抽象方法没法得到实现,所以abstract关键字和final关键字绝对不可以同时出现。

5.接口中static、final、abstract搭配情况

演示:

请编写一个接口,里面定义一个同时是static、final和abstract的方法。

请观察程序运行结果。

代码:

Circle接口:

“全栈2019”Java第六十四章:接口与静态方法详解

Main类:

“全栈2019”Java第六十四章:接口与静态方法详解

结果:

“全栈2019”Java第六十四章:接口与静态方法详解

错误信息:

“全栈2019”Java第六十四章:接口与静态方法详解

文字版:

/Users/admin/Workspace/Java/Hello/src/lab/Circle.javaError:(11, 39) java: 此处不允许使用修饰符final

从运行结果来看,程序出错了。首先,如果使用了abstract关键字,就意味着你的方法是一个抽象方法,再加上一个final修饰符的话,就说明不允许被子类重写,也就是说该抽象方法无法被实现,所以final关键性不可以和abstract关键字同时出现。

那么在接口中,final关键字和static关键字可以同时出现吗?我们来试试:

“全栈2019”Java第六十四章:接口与静态方法详解

结果:

“全栈2019”Java第六十四章:接口与静态方法详解

错误信息:

“全栈2019”Java第六十四章:接口与静态方法详解

文字版:

/Users/admin/Workspace/Java/Hello/src/lab/Circle.javaError:(11, 30) java: 此处不允许使用修饰符final

从运行结果来看,接口中静态方法不能与final关键字搭配使用。对于方法而言,声明为staitc已经说明了只会在内存中存在一份,再加上final就多此一举。

6.多继承接口中的静态方法

多继承中的静态方法不存在覆盖,不存在隐藏。

接口中的静态方法只能使用接口名调用,其实现类都不能直接使用静态方法名调用。

演示:

请编写多个接口,让其一个接口继承其他接口。调用其接口中的静态方法。

请观察程序运行结果。

代码:

Computable接口:

“全栈2019”Java第六十四章:接口与静态方法详解

Drawable接口:

“全栈2019”Java第六十四章:接口与静态方法详解

Shape接口:

“全栈2019”Java第六十四章:接口与静态方法详解

Main类:

“全栈2019”Java第六十四章:接口与静态方法详解

结果:

“全栈2019”Java第六十四章:接口与静态方法详解

从运行结果来看,各个接口分别调用各自静态方法。

注意

未声明为default或static的接口中的方法是隐式抽象的,因此abstract修饰符不与接口方法一起使用(可以使用,但不需要)。

本章小结

  • 接口体可以包含静态方法。方法体适用于静态方法。 静态方法使用static关键字定义。
  • 接口中的所有抽象,默认和静态方法都是隐式公共的,因此我们可以省略public修饰符。
  • abstract关键字和static关键字不能同时出现,因为静态方法不能被重写,也就意味着,抽象静态方法没法得到实现,所以abstract关键字和static关键字不能同时出现。
  • 我们知道被final修饰的方法是不能被子类重写的,这也就意味着抽象方法没法得到实现,所以abstract关键字和final关键字绝对不可以同时出现。
  • 多继承中的静态方法不存在覆盖,不存在隐藏。
  • 接口中的静态方法只能使用接口名调用,其实现类都不能直接使用静态方法名调用。

总结

  • 在Java编程语言中,接口是类似于类的引用类型,它只能包含常量,方法签名,默认方法,静态方法和嵌套类型。 方法体仅适用于默认方法和静态方法。 接口无法实例化 - 它们只能由类实现或由其他接口扩展。
  • 接口体可以包含抽象方法,默认方法和静态方法。接口中的抽象方法后跟分号,但没有大括号(抽象方法不包含实现)。默认方法使用默认修饰符定义,静态方法使用static关键字定义。接口中的所有抽象,默认和静态方法都是隐式公共的,因此我们可以省略public修饰符。
  • 此外,接口可以包含常量声明。接口中定义的所有常量值都是隐式public,static和final,我们可以省略这些修饰符。
  • 接口可以扩展其他接口,就像类子类或扩展另一个类一样。但是,虽然类只能扩展另一个类,但接口可以扩展任意数量的接口。接口声明包括它扩展的所有接口的逗号分隔列表。
  • 未声明为default或static的接口中的方法是隐式抽象的,因此abstract修饰符不与接口方法一起使用(可以使用,但不需要)。
  • 接口的访问修饰符只能是public和默认的访问修饰符。

至此,Java中接口与静态方法相关内容讲解先告一段落,更多内容请持续关注。

附:方法学习资料

“全栈2019”Java第三十三章:方法

“全栈2019”Java第三十八章:类与方法

附:接口学习资料

“全栈2019”Java第六十章:如何定义接口

“全栈2019”Java第六十一章:如何实现接口?

答疑

如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。

上一章

“全栈2019”Java第六十三章:接口与抽象方法详解

下一章

“全栈2019”Java第六十五章:接口与默认方法详解

学习小组

加入同步学习小组,共同交流与进步。

  • 方式一:关注头条号Gorhaf,私信“Java学习小组”。
  • 方式二:关注公众号Gorhaf,回复“Java学习小组”。

全栈工程师学习计划

关注我们,加入“全栈工程师学习计划”。

“全栈2019”Java第六十四章:接口与静态方法详解

版权声明

原创不易,未经允许不得转载!