Java8中接口的新特性测试

2025-05-29 0 16

在java se 8之前,接口中是不能提供方法实现的,但是jdk8提供了接口的默认方法和静态方法的支持。

默认方法

方法前加default关键字就可以提供默认实现,类实现接口时,可以继承接口的默认方法,也可以覆盖默认方法。

?

1

2

3

4

5
interface people {

default void eat(string name) {

system.out.println(name + " is eating.");

}

}

抽象类也可以提供方法的默认实现,一个类可以同时继承一个抽象类和多个接口,如果抽象类和接口中存在相同的方法时会怎么样呢?

一个抽象类和多个接口

如果类继承了抽象类,采取类优先的原则,优先继承抽象类的方法。我们在编写类的时候会发现,必须先extends类再implements接口,否则工具会提示extends的错误。不论抽象类的方法有没有提供默认实现,类都会继承抽象类的方法,就算接口的方法提供了默认实现,也完全不关心。

接口a,b:

?

1

2

3

4

5

6

7

8

9

10
interface a {

default void eat() {

system.out.println("a");

}

}

interface b {

default void eat() {

system.out.println("b");

}

}

抽象类c:

?

1

2

3

4

5
abstract class c {

public void eat() {

system.out.println("c");

}

}

测试类test:

?

1

2

3

4

5

6
public class test extends c implements a, b {

public static void main(string[] args) {

test test = new java8test();

test.eat();

}

}

输出结果:

c

程序输出c说明test类继承了抽象类c的eat方法的实现。

当抽象类c不提供eat方法的默认实现并且test类不提供eat方法的重写时,编译器是不会放过test类的,明明继承了c类,却不提供抽象方法的实现。编译器不会关心test是否还实现了其他接口并且接口中有相同方法,一码归一码。

那么如果是抽象类提供了默认实现,接口没有提供呢?

我们让抽象类c实现eat方法,接口a只提供一个接口,类test不重写eat方法。

接口a,b:

?

1

2

3

4

5

6

7

8
interface a {

void eat();

}

interface b {

default void eat() {

system.out.println("b");

}

}

抽象类c:

?

1

2

3

4

5
abstract class c {

public void eat() {

system.out.println("c");

}

}

测试类test:

?

1

2

3

4

5

6
public class test extends c implements a, b {

public static void main(string[] args) {

test test = new test();

test.eat();

}

}

运行main方法,控制台打印出抽象类中eat方法的输出结果。

其实我们可以这么理解,编译器总要一步一步的编译,首先编译到extends,检查所有的抽象方法是否被重写,有没被重写的方法就抛出编译错误,否则就继续编译。当编译到implements时,类test已经是拥有抽象类c所有方法的实现了,即已经提供了接口a和b中相同方法的重写。

以上总结就是抽象类和接口的方法冲突时以抽象类为准就是了。如果抽象类不在了,两个接口方法冲突了,该听谁的呢?

多个接口

接口a提供方法默认实现,接口b只提供方法。

接口a、b:

?

1

2

3

4

5

6

7

8

9

10
interface a {

default void eat() {

system.out.println("a");

}

}

interface b {

default void eat() {

system.out.println("b");

}

}

测试类test:

?

1

2

3

4

5

6
public class test implements a, b {

public static void main(string[] args) {

test test = new test();

test.eat();

}

}

此时编译器提示,类test从类型a和b中继承了eat()的不相关默认值。也就是说,当两个接口冲突时,编译器无法判断继承a还是继承b的方法实现。这时候,类test就需要自己提供eat()方法的实现了。

静态方法

接口中也可以提供静态方法,使用static关键字。类不能继承接口的静态方法,所以也不存在覆盖静态方法。访问静态方法时通过接口访问,即people.eat(“name”)。

?

1

2

3

4

5
interface people {

static void eat(string name) {

system.out.println(name + " is eating.");

}

}

可以测试一下,调用继承了people接口的类实例的eat方法,工具提示不能通过类实例访问静态成员。或者试着重写一个eat方法并加上@override注解,工具提示“method does not override method from its superclass”。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对快网idc的支持。如果你想了解更多相关内容请查看下面相关链接

原文链接:https://blog.csdn.net/sinat_28394909/article/details/84956125

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Java8中接口的新特性测试 https://www.kuaiidc.com/110542.html

相关文章

发表评论
暂无评论