为了账号安全,请及时绑定邮箱和手机立即绑定

java中的抽象类到底什么作用?感觉完全是鸡肋啊

java中的抽象类到底什么作用?感觉完全是鸡肋啊

慕尼黑5688855 2019-05-23 18:55:51
我要规范代码,直接写接口然后用一个类实现这个接口不就好了,抽象类在实际的开发中到底有没有什么独特的作用?
查看完整描述

2 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

如果你看JDK的源码,就会发现,大部分情况下,你用到的方法,他的父类都是一个抽象类,而不是一个直接的接口。原因主要有两个,接口确实是用来定义规范的,同一个接口下,可能有大量不同的实现,举个例子,List这个接口
booleanadd(Ee);
booleanremove(Objecto);
booleanaddAll(Collectionc);
......
但是你去看ArrayList,第一个继承的是AbstractList(抽象类),然后你去看LinkedList,第一个继承是AbstractSequentialList(抽象类),而AbstractSequentialList也是继承自AbstractList,你肯定知道ArrayList和LinkedList的区别咯。为什么这么做呢,因为有很多方法是可以复用的,比如
publicintindexOf(Objecto);
publicintlastIndexOf(Objecto);
......
如果你纯粹用接口的话,你需要写很多重复的代码,一旦修改,你就麻烦了。抽象类的目的在于,你可以更细致化的表明哪些是不同的,哪些是相同的。所以这就是接口和抽象类的简单区别。如果还不理解,你可以看看collection容器类的源码,就会发现了。
                            
查看完整回答
2 反对 回复 2019-05-23
?
墨色风雨

TA贡献1853条经验 获得超6个赞

将部分共有代码在抽象类中实现。这里举一个在HEADFIRSTDESIGNPATTERNS中的一个例子。
假设现在有各种各样的鸭子,比如橡皮鸭,野鸭。这些鸭子有的能飞有的不能飞,但是它们都有两个翅膀,都能发出声音。根据需求我们会得出以下实现。
publicabstractclassDuck{
privateWingleftWing;
privateWingrightWing;
publicvoidquack(){
...
//quackquack
}
}
publicinterfaceFlyable{
voidfly();
}
publicclassRubberDuckextendsDuckimplementsFlyable{
publicvoidfly(){
...
//cannotfly
}
}
publicclassNormalDuckextendsDuckimplementsFlyable{
publicvoidfly(){
...
//flygracefully
}
}
其实抽象类本质是为了提高代码的复用性。在JAVA中的应用还是很广泛的。比如说Collection接口之下的AbstractCollection抽象类。
当你想要对某个接口进行默认实现,并且不希望在该实现上创建实例,那么抽象类是一个很好的选择。
                            
查看完整回答
反对 回复 2019-05-23
  • 2 回答
  • 0 关注
  • 2250 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信