梧桐落。又还秋色,又还寂寞。

——李清照《忆秦娥》

## 1. 面向对象特性之多态

定义:同一个行为,具有不同的多种表现形式

多态是继封装、继承之后,面向对象的第三大特性。使用多态的前提条件有以下几条:

  • 继承或者实现【二选一】(接口和抽象类)
  • 方法的重写【意义体现:不重写,无意义】
  • 父类引用指向子类对象【格式体现】

1.1 多态的具体使用

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
/**
* java编程思想中:
*
* 针对行为
* 多态分成
* 前期绑定:编译时绑定,绑定是父类。
* 后期绑定:运行时绑定,绑定的是子类。
*
* 针对属性
* 不管是编译期间还是运行期间,他都认为自己是父类。
*
*
* 在使用多态的时候,注意点:
* 子类中有,但是父类中没有的方法,使用多态无法调用。
*
* 父类中有但是子类中没有的方法,使用多态是可以调用的。
*
*
* 使用多态调用子类的属性:
* 1.直接调用:无法实现:
* 2.间接调用:使用方法调用。
* Animal animal = new Dog();//自动向上转型
* Dog dog = (Dog) animal; //向下转型需要强转
* Cat cat = (Dog) animal; // java.lang.ClassCastException 类型转换异常。
* 因为创建的对象是一个狗的对象,但是却强转成了一只猫。不符合现实。
*/

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误。也就是说,不能调用子类拥
有,而父类没有的方法。编译都错误,更别说运行了。这也是多态给我们带来的一点”小麻烦”。所以,想要调用子
类特有的方法,必须做向下转型。

1.2 instanceof 关键字

  1. 判断某个对象是否属于某个类型。

  2. 子类型属于父类型。

  3. 源码分析:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public boolean equals(Object anObject) {
    if (this == anObject) {
    return true;
    }
    if (anObject instanceof String) {
    String anotherString = (String)anObject;
    int n = value.length;
    if (n == anotherString.value.length) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = 0;
    while (n-- != 0) {
    if (v1[i] != v2[i])
    return false;
    i++;
    }
    return true;
    }
    }
    return false;
    }