当前位置: 首页 > 科技观察

我如何理解Java抽象类和接口

时间:2023-03-16 16:59:21 科技观察

在面试中,我们经常被问到:Java中抽象类和接口有什么区别?然后,我们讲抽象类可以有方法,接口不能有实际方法;一个类只能继承一个抽象类,但是可以继承多个接口,巴拉巴拉一大堆,好像标准答案熟练的说出来了。这篇关于抽象类和接口的文章说说它们的区别和联系。它们确实有很多相似之处,但从本质上,或者从语言设计的角度来看,这并不是它们最本质的区别。不做交易,我个人对这两者的理解:类是对具体实例的抽象,比如json字符串的抽象;抽象类是类的抽象;接口是对抽象类的抽象,接口更像是协议监听慢慢说吧~吐槽首先要吐槽一下这种面试。我觉得面试官总是会问诸如“说说抽象类和接口的区别”,“说说进程和线程的区别”之类的问题,都是不负责任的表现。为什么?一个原因是面试官对自己要招的人没有自己的评价标准,另一个原因是他不对面试官负责。这种问题根本考验不了面试官的水平。所以,如果我来面试某人,我会问:请告诉我你是如何理解抽象类和接口的;如果让你向你的祖母解释进程和线程的区别,你会如何解释?我觉得这个可以测试面试官对问题的理解程度,我觉得微软的面试题(你怎么跟你奶奶解释Excel),测试一个人对某件事的理解程度(虽然,到目前为止,我还是可以的这道题很好理解-.-)抽象类和接口的区别说到抽象类和接口,就一定要说到类。类是对真实事物的抽象。比如定义一个BenzCar类,就需要对真正的奔驰有很好的抽象(当然奔驰有很多系列,这里就不钻牛角尖了)。也就是说,如果你想造一辆奔驰车,你需要BenzCar这个类(这辆奔驰车在内存中是一个Instance)。那么抽象类就是一个类的抽象。你怎么理解的?也就是说很多汽车厂商一起定义了一个规范(Car类),说要造一辆汽车,需要发动机,轮胎,音响设备...(这些相当于抽象方法),用什么发动机具体而言,轮胎和音响设备由各汽车制造商完成。这样就有了各种车,奔驰,宝马,丰田……接口就是抽象类的抽象。这只是我个人的理解。我们在日常生活中可以看到各种各样的“接口”,电源插座就是其中之一。一开始看到老鼠大叔的博客,开始理解“控制反转”的概念——IoC/DIP其实是一种管理思想|酷壳-CoolShell.cn。后来一想,这东西其实到处都是。制造电源插座的工厂和制造电器的工厂只需要约定一种“接口”——两个插座或三个插座。当然,每个国家的接口是不同的。需要适配器才能在它们之间进行转换。其实在程序中也是如此。比如所有的交通工具都可以抽象成一个接口Drivable(可能是经验原因,我没有考虑好),代表实现这个接口的类创建的对象(比如:汽车,飞机,轮船等)都是可驱动的publicinterfaceDrivable{publicvoiddrive;然后,我们可以创建一个AbstractCar类,它代表所有汽车类的抽象。所有可驾驶的汽车都必须继承这个类。在这个抽象类中指定了一些抽象方法,比如getEngine(当然你也可以继承AbstractCar类,对所有可能拥有相同引擎的汽车进行一层抽象)。驱动器设置为抽象。我觉得这两个实现在功能上是一样的,但是在类设计上是不一样的。下面代码中的实现,我参考java.util.AbstractList*@throwsUnsupportedOperationException*ifaddingtothisListisnotsupported。公共抽象轮getWheel;@Overridepublicvoiddrive{thrownewUnsupportedOperationException;}//省略其他方法和属性}默认情况下,“car”不能被驱动。当你实现了一个car类之后,你需要重写这个方法实现自己的drive方法,才能在java容器中列出例如查看源码,会发现最顶层的继承关系是Iterable,也就是说可以遍历List,同时也会生成一个Iterator接口对象。这意味着这个迭代器可以遍历一个列表。这就好比上面说的,所有的车都可以开,所有的list都可以遍历。往下一层,类变得更加具体。***为什么接口可以继承?其实原理很简单。因为总有一个本质的约定来约束大家,比如所有的车辆都是可以开的,所有的便利设施都是可以穿越的。然后协议会逐渐具体化:Iterable<-Collection<-List<-AbstractList<-List从下到上,逐层抽象。正如我在文章开头所说的,