目录
  1. 1. 多态的优点
  2. 2. 多态存在的三个必要条件
  3. 3. 多态中的成员访问特点
    1. 3.1. 成员变量
    2. 3.2. 构造方法
    3. 3.3. 成员方法
    4. 3.4. 静态方法
  4. 4. 多态的弊端
    1. 4.1. 解决方案
      1. 4.1.1. 对象间的转型问题
  5. 5. 多态继承中的内存图解
  6. 6. 思考
java多态的体现

多态的优点

  1. 消除类型之间的耦合关系

  2. 可替换性

  3. 可扩充性
  4. 接口性
  5. 灵活性
  6. 简化性

多态存在的三个必要条件

  • 继承
  • 重写
  • 父类引用指向子类对象

例如:

Parent p = new Child();

多态中的成员访问特点

成员变量

编译看左边,运行看左边。

构造方法

创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。

成员方法

编译看左边,运行看右边。

由于成员方法存在方法重写,所以它运行看右边。

静态方法

编译看左边,运行看左边。
(静态和类相关,算不上重写,所以,访问还是左边的)

多态的弊端

不能使用子类的特有功能

class Animal {
public void eat(){
System.out.println("吃饭");
}
}

class Dog extends Animal {
public void eat() {
System.out.println("狗吃肉");
}

public void lookDoor() {
System.out.println("狗看门");
}
}

class DuoTaiTest {
public static void main(String[] args) {
//定义为狗
Animal a = new Dog();
a.eat();
a.lookDoor();
}
}

可以看见,如果调用子类的lookDoor()方法是行不通的

解决方案

如果就想使用子类的特有功能呢?

  • 创建子类对象调用方法即可。(可以,但是很多时候不合理。而且,太占内存了)
  • 把父类的引用强制转换为子类的引用。(向下转型)

对象间的转型问题

//向上转型:
Parent p = new Child();
//向下转型:
Child c = (Child)p; //要求该p必须是能够转换为Child的。

多态继承中的内存图解

思考

看程序写结果:先判断有没有问题,如果没有,写出结果

/*
看程序写结果:先判断有没有问题,如果没有,写出结果

多态的成员访问特点:
方法:编译看左边,运行看右边。

继承的时候:
子类中有和父类中一样的方法,叫重写。
子类中没有父亲中出现过的方法,方法就被继承过来了。
*/
class A {
public void show() {
show2();
}
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 DuoTaiTest4 {
public static void main(String[] args) {
A a = new B();
a.show(); // 爱

B b = new C();
b.show();
}
}

结果是:



分析

a.show();时,首先看自身是否含有show()方法,没有就去找父类是否含有这个show()方法

父类存在

public void show() {
show2();
}

子类即调用show2()

public void show2() {
System.out.println("爱");
}

同理b.show()时,C含有show()方法,调用父类的show()

public void show() {
super.show();
}

由上可知,B的show()即是调用show2(),则C调用show2()

public void show2() {
System.out.println("你");
}

因此结果为:



文章作者: Jachie Xie
文章链接: https://xjc5772.github.io/2020-08/12/%E5%AD%A6%E4%B9%A0/%E5%90%8E%E7%AB%AF%E5%AD%A6%E4%B9%A0/JAVA/java%E5%A4%9A%E6%80%81%E7%9A%84%E4%BD%93%E7%8E%B0/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 XJC&Blog
打赏
  • 微信
  • 支付宝

评论