关键词:
上一篇栈长发了这篇《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... 查看详情