美文网首页程序员
java笔记_多态的相关使用

java笔记_多态的相关使用

作者: CodeGalaxy | 来源:发表于2020-07-26 12:15 被阅读0次

    多态

    Employee e;
    e = new Employee();
    e = new Manager();
    

    以上代码就体现出了Employee的多态性。

    在Java程序设计语言中,对象变量是<u>多态的</u>。一个Employee变量既可以引用Employee的对象,也可以引用Employee类的任何一个子类的对象,这就是多态性。

    但是,使用多态时要注意

    Manager Boss = new Manager();
    Employee employee = new Manager();
    Boss.setBonus(5000); //OK
    //但是下面这个代码却是错的
    employee.setBonus(5000); //ERROR
    

    错误的原因也很明显:setBonus是Manager类的方法,而Employee类没有setBonus方法,所以无法在employee的方法表中查找到setBonus方法,所以employee不能调用setBonus方法

    还有一种错误,不能将父类的引用赋值给子类变量,像下面这段代码就是犯了这种错误

    Manager manager = new Employee();
    

    3.2 理解方法调用

    下面是调用方法过程的详细描述:

    1. 编译器查看对象的声明类型和方法名

    ​ 需要注意的是:有可能存在多个名字为f但参数x类型不一样的方法。例如,可能存在方法f(int)和方法f(String)。编译器将会一一列举C类中所有名为f的方法和其超类中所有名为f而且<u>可访问</u>的方法。

    2. 编译器要确定方法调用中提供的参数类型

    如果在所有名为f的方法中存在一个与所提供参数类型完全匹配的方法,就选用这个方法。

    3. 动态绑定与静态绑定

    • 静态绑定:如果是private方法,static方法,final方法或者构造器,那么编译器可以准确的知道该调用哪个方法。

    • 动态绑定:虚拟机必须调用与x所引用对象的实际类型对应的那个方法。假设x的实际类型是D,它是C的子类。如果D类定义了方法f(String),那么就会调用这个方法。否则,将在D类的超类中寻找f(String),以此类推。

    补充:

    方法重写

    1。@Override检查是否进行正确重写。(非必须)

    2。如果子类覆写了父类的方法

    public class Main {
        public static void main(String[] args) {
            Person p = new Student();
            p.run(); //应该打印Person.run还是Student.run?
        }
    }
    
    class Person {
        public void run() {
            System.out.println("Person.run");
        }
    }
    
    class Student extends Person {
        @Override
        public void run() {
            System.out.println("Student.run");
        }
    }
    

    一个实际类型为Student,引用类型为Person的变量,调用其run()方法,打印出Student.run。


    多态补充

    : 多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。

    前提和体现:

    1.有继承/实现关系
    2.有方法重写
    3.有父类引用指向子类对象 (举个栗子:动物 animal = new 猫();).


    1.多态中成员访问特点

    • 成员变量:编译看左边,执行看左边。
    • 成员方法:编译看右边,执行看左边。
    为什么成员变量和成员方法的访问不一样呢?
    • 因为成员方法有重写,成员变量没有。

    2.多态的好处与弊端

    1、好处:提高了程序的扩展性

    具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类类型参与操作。

    2、弊端:不能使用子类的特有功能

    3.转型

    1.向上转型
    (从子到父,父类引用指向子类对象)

    Animal a = new Cat();

    2.向下转型(从父到子,父类引用转化为子类对象)

    Cat c=(Cat a);

    相关文章

      网友评论

        本文标题:java笔记_多态的相关使用

        本文链接:https://www.haomeiwen.com/subject/qfewlktx.html