码迷,mamicode.com
首页 > 其他好文 > 详细

18.多态

时间:2021-05-24 04:39:29      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:转型   对象   实例   父类   自己的   运行时   out   向上转型   变量   

多态

一个类的多种形式

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

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

编译时多态:通过 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

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

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

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

18.多态

标签:转型   对象   实例   父类   自己的   运行时   out   向上转型   变量   

原文地址:https://www.cnblogs.com/WNAOII/p/14752226.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!