抽象类可以使用implements关键字实现接口,但又不用在该抽象类里实现接口里的具体方法(不实现接口的具体方法不会报错),那设计抽象类可以使用implements来实现接口有什么意义啊?
抽象类:
public abstract class TestAbstract implements TestInerface {
}
接口:
public interface TestInerface {
public void setName();
public void getName(String s);
}
按照我个人的理解,抽象类本来就可以保有抽象方法,而接口只是一种类的外形大题轮廓,抽象类实现接口,可以在接口的基础上,将这个外形进一步具体化,当然你也可以选择不进一步具体化,就是放着接口的方法不管,让他们作为抽象类的抽象方法;虽然不会报错,但是使用的时候还是要老老实实把抽象方法都实现才可以;个人拙见。
我打个比方,比如A是一个借口,里面有a,b,c,d4个抽象方法,而这时候,我们想让某些方法内容已实现,而某些方法放给调用者实现,这时候就出现了抽象类,抽象类可以选择性实现接口的方法,最直观的例子是List,不论是LinkedList,还是ArrayList,都继承了AbstractList,而AbstractList又实现了List接口,为什么要这样呢?因为ArrayList和LinkedList有些东西是一样的,没有必要重复2次,所以就有了AbstractList作为中间量!
其本质就是为了高复用性,减少代码重复度,一个高质量代码,其必然考虑,一切封装出去,相同的代码绝对不能重复出现在两个地方,否则就会产生代码冗余.
至于解耦合等代码规范,和这个问题不搭边,所以不多说
我打个比方
在代码设计时,你想设计一辆车,它的引擎是实现了一种最新技术,就叫超速涡轮引擎技术吧.这种技术可扩展且所有车都能接上所以设计成接口.
如果这辆车出二代了,二代车继承了一代车的所有特性包括涡轮技术.那么这个时候,二代车只用直接extends一代,并扩展自己的功能.
上面说的一代是类,非抽象类.可以看出继承的好处,如果一代车只是个模板(抽象类),商家用这个模板出了二代\三代车
那么二三代继承了一代就定义了它们都拥有这种技术,那么它们都应该为这种技术做出实现.
总结: 抽象类和接口一样,是对继承\实现类的一种规范的预定义或者说是限制,而接口的定义更广.抽象类实现接口,是为了继承这种能力(预定义).
当然你说二三代车自己实现不行吗,可以,但是相当于告诉别人,这种车设计之初就是没有这种技术的,而从代码编写的角度看,有可能你会忘了去实现这种能力,
而且每个一代继承车想要这种接口都要自己实现.
抽象类其实主要还是为了数据或者代码片段的封装,将其封装以后,比如别人来调用接口中的
public void setName(); public void getName(String s);这些方法就不会影响下面的实现代码,你只要传递参数就行了,像把大象装入冰箱,只要三步:
1.打开冰箱门2.把大象放进去3.关上冰箱门,具体说是大象要是放不进去需要做哪些处理不是你考虑的,既然他给你了这些方法,你就直接放,如果放不进去出现错误你再去覆盖他的实现.其实接口也就是相当于指定一个统一的规格,统一的名称像你的usb'一样,大家生产出来都是那个样子的,但是里面的草窝可以不同.
首先,抽象类本身不能被实例化,所以在抽象类中实现接口的具体方法后,抽象类自身无法调用该方法。new 该抽象类的对象会自动生成一个匿名内部类,该匿名类是抽象类的子类,且必须实现抽象类实现的接口没有实现的方法,如果抽象类实现了部分接口的方法且是非私有,子类可以直接调用该方法不需要实现,也能够重写覆盖该方法。抽象类的非私有的方法可以被子类调用、重写。抽象类实现接口是为了子类继承的父类多添加一些功能让子类的行为更多,扩充的功能更完善,随时满足功能添加的需求,让子类来直接调用或者实现并执行这些功能、方法。