博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java中接口和抽象类的区别
阅读量:4316 次
发布时间:2019-06-06

本文共 1994 字,大约阅读时间需要 6 分钟。

(一)语法层面的区别:

抽象类:

1.用abstract表示

2.里面有一个或多个抽象方法,在方法前加abstract,抽象类中也可以没有抽象方法,如静态方法,静态代码块

3.抽象类用extends继承,并且必须重写抽象方法,如果不重写的话则子类也会成为抽象类

接口

1.用implement表示

2.接口是极度抽象的类,所有方法都是抽象的,都需要进行重写

3.接口中默认的修饰符为public abstract(如果非要自己加访问符号,jdk1.8之前只能是public,而不能是private,static这些。jdk1.8新特性后面会有介绍)

接口的作用:解决java中的单继承问题,一个类可以实现多个接口,但只能有一个父类

 

(二)设计模式上的区别

抽象类:

1.面向类的整体进行一个抽象。比如对飞机或者鸟抽象出这两个类都具有的特点

2.是一种模板式设计,抽象出这个类的共同点。如果对抽象类新增了实现方法,则子类将不会发生发生改变,新增抽象方法则将发生改变

接口:

1.面向行为进行一个抽象。如鸟和飞机都会飞是一个行为,则可以将其设计为一个接口,然后让鸟类和飞机类都实现它们各自飞的特性

2.是一种辐射式设计模式,修改了接口,则实现了接口的类则需要发生改变

 

共同点:都不能被实例化

 

java8接口新特性:

java8使用两个概念扩展了接口的含义:默认方法和静态方法。

1)默认方法

默认方法使得开发者可以在不破坏二进制兼容包的情况下,默认实现接口中的方法。即不强制那些实现了该类的接口的类也实现这个方法。默认方法会被接口的实现类继承或者覆盖。默认方法需要被default修饰。

举个例子:

接口:TestJava8Interface

public interface TestJava8Interface {    default String hello() {        return "hello";    }}

实现类:TestInterface8.java

public class TestInterface8 implements TestJava8Interface{    @org.junit.Test    public void Test() {        TestJava8Interface t = new TestInterface8();        System.out.println(t.hello());    }}

运行结果:

hello

对接口中的方法进行覆盖

实现类:TestInterface8.java

public class TestInterface8 implements TestJava8Interface{    @Override    public String hello () {        return "override hello";    }    @org.junit.Test    public void Test() {        TestJava8Interface t = new TestInterface8();        System.out.println(t.hello());    }}

运行结果:

override hello

 

2)静态方法

接口:TestJava8Interface

public interface TestJava8Interface {     static String  helloWorld() {        return "hello world";     }}

实现类:TestInterface8.java

public class TestInterface8 implements TestJava8Interface{    @Test    public void test () {        System.out.println(TestJava8Interface.helloWorld());    }}

运行结果:

hello world

由于JVM上的默认方法的实现在字节码层面提供了支持,因此效率非常高。默认方法允许在不打破现有继承体系的基础上改进接口。该特性在官方库中的应用是:给java.util.Collection接口添加新方法,如stream()parallelStream()forEach()removeIf()等等。

尽管默认方法有这么多好处,但在实际开发中应该谨慎使用:在复杂的继承体系中,默认方法可能引起歧义和编译错误。如果你想了解更多细节,可以参考。

 

 

 

转载于:https://www.cnblogs.com/Hdaydayup/p/7183303.html

你可能感兴趣的文章
【Luogu】P2498拯救小云公主(spfa)
查看>>
如何获取网站icon
查看>>
几种排序写法
查看>>
java 多线程的应用场景
查看>>
dell support
查看>>
转:Maven项目编译后classes文件中没有dao的xml文件以及没有resources中的配置文件的问题解决...
查看>>
解决“Eclipse中启动Tomcat后,http://localhost:8080/无法访问”的问题
查看>>
MTK android 设置里 "关于手机" 信息参数修改
查看>>
隐私声明
查看>>
页面插入iframe嵌套
查看>>
019 jquery中的动画
查看>>
hello C#
查看>>
036 互联网的框架演变
查看>>
转载:基于《知网》的词汇语义相似度计算
查看>>
常用C库简介
查看>>
Linux 上的常用文件传输方式介绍与比较
查看>>
[转载]电话销售技巧全面大攻略
查看>>
LZW压缩算法原理及其Java实现
查看>>
VNC-Server installation on CentOS 7
查看>>
Unity中用触摸控制物体旋转和放大
查看>>