javaSE复习之——面向对象_多态

多态前提

  • a : 要有继承关系。
  • b : 要有方法重写。
  • c : 要有父类引用指向子类对象。

    例有一个父类fu和一个子类zi,那么父类引用子类对象为:

    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
      fu a = new zi(); ```
    <!--more-->
    # 成员变量
    - 编译、运行看左边(父类)


    也就是创建对象后,`子类引用对象就优先调用子类(这样就不是多态了,因为它没有父类引用子类对象)`,`父类引用对象就优先调用父类(编译运行看左边)`


    - 解析:创建对象时,首先在堆中创建子类的对象(this),而这个子类的对象中有一个区域指向super,如果引用这个对象的是`父类`那么这个引用指向`super`区域,否则指向`this`区域


    # 成员方法
    - 编译看左边(父类)、运行看右边(子类)。`动态绑定`


    ps:父类中一定要有和子类一样的方法,父类中的那个方法可以理解为一个跳板跳转到子类中的方法中。



    # 静态成员方法
    - 与成员变量同理,`编译、运行看左边(父类)`,所以`多态中静态方法不存在重写`

    # 多态的弊端
    - 父类引用不能使用子类`特有的属性和行为`,但是能通过

    zi b = (zi)a; //强转类型```

多态的好处

1、提高了代码的维护性(继承保证)

2、提高了代码的扩展性(由多态保证)

多态的使用

1、开发是很少在创建对象的时候使用多态,而是直接创建子类引用子类对象

2、在需要使用方法使代码简洁时,当做参数使用多态效果最好,因为扩展性强

比如:现有三个类“动物”“”“”动物是父类,当我们有很多只狗和猫需要跑时,就可以使用方法函数来使代码简洁,在调用这个方法时可以创建好一个 狗 或 猫 的对象然后传给参数,这就需要使用到多态了,如果不使多态那么就需要给狗和猫分别创建一个函数。

  • 不过在方法中使用多态还有一个问题:狗 和 猫 都有各自特有的功能与属性,如果调用猫的功能,但是传入的对象是狗,那么就出错了。

  • 解决方法:关键字 instanceof

ps:了解一下,开发中用到的不多,一般都用到方法重写

  • 代码实例:
1
2
对象变量A   instanceof   对象变量B
//如果是相同的类返回true

多态中的代码分析

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
class A {
public void show() {
show2(); //这里调用的是子类中的show方法
}
public void show2() {
System.out.println("我");
}
}
class B extends A {
public void show2() {
System.out.println("爱");
}
}
class C extends B {
public void show() {
super.show();
}
public void show2() {
System.out.println("你");
}
}
public class Test2DuoTai {
public static void main(String[] args) {
A a = new B();
a.show();//返回一个爱

B b = new C();
b.show();
}
}
  • 得出结果:

    在多态中,父类中的方法调用另一个方法,且被调用的方法都存在于子类与父类中的情况下,优先调用子类的方法,也就是父类方法成为了一个跳板,跳转到了子类的方法中

  • 还是那句话:

    成员方法编译看左边(父类)、运行看右边(子类)

    成员变量编译看左边(父类)、运行看左边(父类)