简单理解

1、封装

封装的实质,是提供了新的数据类型。

2、继承

从外部看,从父类(基类)继承得到的子类(导出类)就像一个与基类具有相同接口(非interface声明的接口)的新类。当创建了一个导出类的对象时,该对象就已经包含了一个基类的子对象。继承带来了多态的便捷性。

导出类可以通过覆写(@Override)基类的方法,来使同一个方法根据自己特性的不同而产生不同的表现和作用。

3、多态

多态,即将改变的事物与未变的事物分离开。

通过继承而来的导出类,能够使用向上转型的方式,来达到后期绑定(也称为动态绑定运行时绑定)。

  • 绑定:将一个方法用同一个方法主体关联起来。
  • 后期绑定:运行时根据对象的类型进行绑定。

具体谈多态的特性

先通过一段代码,来解释普通类继承抽象类继承接口实现分别如何实现多态。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
abstract class Transportation {
public Transportation() {
System.out.println("This is a transportation.");
}

public abstract void forward();
}

interface TransportPower {
void powerSource();
}

class Car extends Transportation {
private wheelNum = 4;

public int getWheelNum() {
return wheelNum;
}

@Override
public void forward() {
System.out.println("Car goes forward.");
}
}

class OilCar extends Car implements TransportPower {
@Override
public void powerSource() {
System.out.println("Use oil as power.");
}

public void highSpeed() {
System.out.println("OilCar can highSpeed.");
}
}

1、普通类继承

导出类不一定需要覆写基类的所有方法,导出类对象中包含了基类的子对象,故通过getWheelNum()方法,可以获得基类中的成员变量wheelNum

2、抽象类继承

抽象类的导出类必须覆写基类的抽象方法,赋予具体实现。

3、接口实现

实现了某接口的类必须覆写接口中所有的方法,赋予具体实现。

所有导出类,都可以通过向上转型的方式,在运行时绑定,从而实现多态性。

抽象类与接口的区别

  1. 接口只能定义抽象方法,而抽象类可以定义非抽象方法。
  2. 类只能单继承,而接口可以多实现。

深层讲解

参考链接:https://blog.csdn.net/aptentity/article/details/68942916

  • 抽象类
    • 对类型进行隐藏,可以构造出一个固定的一组行为的抽象描述,一个行为可以有任意个可能的具体实现方式。这个抽象的描述就是抽象类。(即多态性的体现)
    • 这一组任意个可能的具体实现表现为所有可能的导出类,模块可以操作一个抽象类,由于模块依赖于一个固定的抽象类,那么它是不允许修改的。同时通过这个抽象类进行派生,拓展此模块的行为功能。
  • 接口
    • 接口可以补充Java只有单继承的特性,实现“多继承”。
    • 把程序模块进行固化的契约,降低偶合。把若干功能拆分出来,按照契约来进行实现和依赖。
    • 定义接口有利于代码的规范。

抽象类强调的是从属关系,接口强调的是功能。