java8中的抽象类和接口到底有啥区别?

Java技术栈      2022-04-03     321

关键词:

上一篇栈长发了这篇《Java 8 有多牛逼?打破一切你对接口的认知!》,帮助许多人解开了疑惑,还有读者留言说两者还有啥区别,故引发了此篇:

在我们面试时也会经常遇到面试官问抽象类和接口的区别是什么,大部人肯定会说:接口中的所有方法都是抽象的,抽象类中的方法除了抽象方法还可以写实现方法,如果你还这样回答那你就 OUT 啦,要跟上形式。

这个问题我在面试一个 39 岁的程序员时,他居然也没回答上来,其实了解 Java 8 的同学应该都知道,Java 8 在接口中推出了默认方法、静态方法,打破了接口只能写抽象方法的传统,如果你还不知道的可以点击阅读我之前发的这篇文章。

既然接口都能写实现方法了,那么还要抽象类干嘛呢?Java 8 中的接口和抽象类到底还有啥区别?大家是不是都有困惑?

所以,栈长这篇带大家分析一下,不一定全,但希望对你有用。

区别1:

首先抽象类是一个“类”,而接口只是一个“接口”,两者的概念和应用场景不一样,这也是抽象类和接口的主要区别。

区别2:

即使在 Java 8 中接口也能写实现方法了,但却不能写构造方法,而在抽象类是可以写构造方法的,意味着抽象类是参与类的实例化过程的,而接口则不是。

区别3:

抽象类可以有自己的各种成员变量,并且可以通过自己的非抽象方法进行改变,而接口中的变量默认全是 public static final 修饰的,意味着都是常量,并且不能被自己和外部修改。

区别4:

接口可以实现多继承,而抽象类只能单继承。

下面我举两个例子:

public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable {
    ...
}    
public interface Connection  extends Wrapper, AutoCloseable {
...
}

类与类只能单继承,而类与接口、接口与接口可以多继承。

总结

Java 8 中的接口和抽象类的区别除了接口中可以写实现方法之外这点变化,其他的还是保持不变的。

既然接口可以写方法实现了,那么抽象类的存在貌似是弱化了,因为类只能是单继承,耦合性不好,而接口可以多实现,可以灵活扩展,也不会增加类的耦合性。

虽然说是少用继承,多用组合的设计理念,但继承的场景也还是存在的,比如我们常用的模板设计模式就是抽象类和各种模板的子类,所以说,接口也不能完全代替抽象类的。

你认为抽象类的应用场景还有哪些呢?欢迎留言分享!

最后,Java 系列教程还会继续更新,关注Java技术栈公众号第一时间推送,还可以在公众号菜单中获取历史 Java 教程,都是干货。

近期热文推荐:

1.Java 15 正式发布, 14 个新特性,刷新你的认知!!

2.终于靠开源项目弄到 IntelliJ IDEA 激活码了,真香!

3.我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。

4.吊打 Tomcat ,Undertow 性能很炸!!

5.《Java开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!

抽象类和接口有啥区别? [复制]

】抽象类和接口有啥区别?[复制]【英文标题】:What\'sthedifferencebetweenanabstractclassandaninterface?[duplicate]抽象类和接口有什么区别?[复制]【发布时间】:2013-02-1703:55:25【问题描述】:假设我们在一个接口中有两个方法M1()和M2()。一... 查看详情

抽象类和接口的区别

...,接口也可以单继承接口,接口也还可以多实现;4.接口中的属性是staticfinal类型的,抽象类中的属性跟普通类中的属性没有区别;5.接口中的方法默认就是抽象的不需要加abstract, 查看详情

php中的抽象和接口有啥区别? [复制]

】php中的抽象和接口有啥区别?[复制]【英文标题】:Whatisthedifferencebetweenabstractandinterfaceinphp?[duplicate]php中的抽象和接口有什么区别?[复制]【发布时间】:2011-04-0408:59:57【问题描述】:可能重复:PHP:Whatisthedifferencebetweenaninterface... 查看详情

Java中的接口和抽象类有啥区别? [复制]

】Java中的接口和抽象类有啥区别?[复制]【英文标题】:WhatisthedifferencebetweenaninterfaceandanabstractclassinJava?[duplicate]Java中的接口和抽象类有什么区别?[复制]【发布时间】:2012-04-2811:07:44【问题描述】:可能重复:Whatisthedifferencebetw... 查看详情

Typescript中的接口和抽象类有啥区别?

】Typescript中的接口和抽象类有啥区别?【英文标题】:WhatisthedifferencebetweeninterfaceandabstractclassinTypescript?Typescript中的接口和抽象类有什么区别?【发布时间】:2018-10-1103:48:32【问题描述】:我写了几行代码来试验和区分这两者:... 查看详情

接口和抽象类的区别

抽象类和接口是面向对象编程中的基本概念,类(含抽象类)、接口、数组是同一个级别的概念,都属于引用数据类型。相同点:? 抽象类和接口均包含抽象方法,类必须实现所有的抽象方法,否则是抽象类。? 抽象类和... 查看详情

抽象类和接口的异同?

...承抽象类。如果子类不是抽象类的话,它需要重写抽象类中的抽象方法;接口子类使用关键字implements来实现接口,它需要重写接口中没有默认。 3、构造器抽象类可以有构造器,接口不能有构造器。4、与正常Java类的区别除... 查看详情

抽象类和接口的区别?

...含有abstract方法的类必须定义为abstractclass,abstractclass类中的方法不必是抽象的。abstractclass类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽... 查看详情

抽象类和接口的区别

...icfinal)(默认)。3.抽象类可以包含非抽象的普通方法,接口中的方法必须是抽象的,不能包含非抽象的普通方法。4.抽象类可以包含构造函数,接口中没有构造函数。5.一个类可以继承多个接口,但只能继承一个抽象类。6.抽象类中... 查看详情

返璞归真之抽象类和接口区别

抽象类:1.抽象类必须声明标识关键字(abstract)2.抽象类中的抽象属性和方法也得声明关键字3.抽象类中可以有非抽象属性和方法,但子类无法重写;抽象方法没有方法体4.抽象类中的属性和方法不可以用private修饰符;当然非抽象... 查看详情

抽象类和静态类有啥区别?

】抽象类和静态类有啥区别?【英文标题】:What\'sthedifferencebetweenanabstractclassandastaticone?抽象类和静态类有什么区别?【发布时间】:2011-01-2408:22:00【问题描述】:两者都不是可实例化的。有什么区别?在什么情况下您可以使用... 查看详情

抽象类和接口的区别(代码片段)

a.接口中的所有方法都是抽象的,而抽象类可以定义带有方法体的不同方法。b.一个类可以实现多个接口,而只能继承一个抽象父类。c.接口与实现它的类不构成继承体系,而抽象类是属于一个类的继承体系。d.接口中的方法默认... 查看详情

抽象类和接口的区别(代码片段)

a.接口中的所有方法都是抽象的,而抽象类可以定义带有方法体的不同方法。b.一个类可以实现多个接口,而只能继承一个抽象父类。c.接口与实现它的类不构成继承体系,而抽象类是属于一个类的继承体系。d.接口中的方法默认... 查看详情

抽象类和接口联系与区别

...4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只 查看详情

抽象类和接口的联系和区别

...法,则必须将子类也定义为为abstract类。 接口:接口中的变量会被隐式地指定为publicstaticfinal变量,并且只能是publicstaticfinal变量,用private修饰会报编译错误,而方法会被隐式地指定为publicabstract方法且只能是publicabstract方法... 查看详情

抽象类和接口的区别

...两个修饰。  抽象类的方法修饰词没有限制。4、接口中的方法都没有方法体。  抽象 查看详情

抽象类和接口的区别

...用抽象类和接口?  如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。 如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此... 查看详情

抽象类和只有受保护构造函数的类有啥区别? (。网)

】抽象类和只有受保护构造函数的类有啥区别?(。网)【英文标题】:What\'sthedifferencebetweenanabstractclass,andaclasswithonlyprotectedconstructors?(.NET)抽象类和只有受保护构造函数的类有什么区别?(。网)【发布时间】:2011-01-1316:07:27... 查看详情