接口和抽象是 Java 面向对象设计的两个基础机制。
接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到API 定义和实现分离的目的。
抽象类不能实例化,用 abstract 关键字修饰 class, 其主要目的是代码重用。
当打算提供带有部分实现的“模板”类,而将一些功能需要延迟实现请使用抽象类;当你打算提供完整的具体实现请使用类。
public class ArrayLis<E> extends AbsractLis<E> implements Lis<E>, RandomAccess, Cloneable, java.io.Serializable
{
//...
}
Java 不支持多继承。Java 类可以实现多个接口,因为接口是抽象方法的集合,采用声明抽象方法的方式,但是并不能通过扩展多个抽象类来重用逻辑。
还有一些场景,需要抽象与具体实例化无关的通用逻辑,比如 Utils 类,但是如果采用抽象类,这样就存在单继承的问题。
面向对象的基本要素:封装,继承,多态。
要注意的是 方法名称和参数一致,但是返回值不同,这样不是重载,编译会报错!!!
public int doSomething() {
return 0;
}
// 输入参数不同,意味着方法签名不同,重载的体现
public int doSomething(Lis<String> srs) {
return 0;
}
// return类型不一样,编译不能通过
public short doSomething() {
return 0;
}
interface Coder {
void wearSweater(Sweater sweater);
}
class XiaoMing implements Coder{
@Override
public void wearSweater(Sweater sweater) {
}
}
interface Sweater {
}
class TneckSweater implements Sweater {
}
Coder xiaoming = new XiaoMing();
Sweater tneckSweater = new TneckSweater();
xiaoming.wearSweater(tneckSweater);
依赖反转
开闭原则改造如下代码:
public class VIPCenter {
void serviceVIP(T extend User user>) {
if (user insanceof SlumDogVIP) {
// 穷X VIP,活动抢的那种
// do somthing
} else if(user insanceof RealVIP) {
// do somthing
}
// ...
}
修改关闭,扩展开放的原则:
public class VIPCenter {
private Map<User.TYPE, ServiceProvider> providers;
void serviceVIP(T extend User user) {
providers.get(user.getType()).service(user);
}
}
interface ServiceProvider{
void service(T extend User user) ;
}
class SlumDogVIPServiceProvider implements ServiceProvider{
void service(T extend User user){
// do somthing
}
}
class RealVIPServiceProvider implements ServiceProvider{
void service(T extend User user) {
// do something
}
}