菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
78
0

18.多态

原创
05/13 14:22
阅读数 62590

多态

一个类的多种形式

多态就是同一方法作用的对象不同而出现不同的行为方式。

人话:完成一件事,由不同的人去解决,会有不同的解决方法。(哈姆雷特?)

编译时多态:通过 overloading(重载) 实现

运行时多态:通过 overriding(重写) 和 继承实现

多态存在的三个条件:

  • 拥有继承关系
  • 子类重写父类方法
  • 父类引用指向子类对象:Parent p = new Child( );
    • upcasting 向上转型:将子类对象直接赋值给父类引用
    • downcasting:向下转型:将指向子类对象的父类引用赋值给子类引用

实例:

package com.wnaoii.oop.Demo06;

//父类
public class Person {

    public int age = 0;

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

和父类有继承关系的Student类:

package com.wnaoii.oop.Demo06;

// 子类
public class Student extends Person {

    public int age = 19;

    // 重写父类的 run() 方法
    @Override
    public void run() {
        System.out.println("子类run()方法被调用!");
    }
    // 子类特有的方法
    public void eat() {
        System.out.println("子类特有eat()方法被调用!");
    }
}

调用:

package com.wnaoii.oop;

import com.wnaoii.oop.Demo06.Person;
import com.wnaoii.oop.Demo06.Student;

public class Application {

    public static void main(String[] args) {

        Student s1 = new Student();
        // 父类的引用指向子类的对象(向上转型)
        Person s2 = new Student();

        // 多态成员方法调用
        s1.run();   // 能调用自己的和继承的方法
        s1.eat();	// 类型是 Student 正常调用
        System.out.println();

        s2.run();   // 子类重写了父类的方法,所以优先执行子类的方法
        // s2.eat();	s2的类型为 Person ,而Person中没有eat()方法,无法调用
        System.out.println();

        // 多态成员变量调用
        System.out.println(s1.age);
        System.out.println(s2.age);

    }
}

结果:

子类run()方法被调用!
子类特有eat()方法被调用!

子类run()方法被调用!

19
0

由此可以看出多态成员访问的特点:

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

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

发表评论

0/200
78 点赞
0 评论
收藏