欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java笔记_多态的相关使用

程序员文章站 2022-07-10 19:07:38
多态Employee e;e = new Employee();e = new Manager();以上代码就体现出了Employee的多态性。在Java程序设计语言中,对象变量是多态的。一个Employee变量既可以引用Employee的对象,也可以引用Employee类的任何一个子类的对象,这就是多态性。但是,使用多态时要注意Manager Boss = new Manager();Employee employee = new Manager();Boss.setBonus(500...

多态

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

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

在Java程序设计语言中,对象变量是多态的。一个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而且可访问的方法。

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);

本文地址:https://blog.csdn.net/qq_41735112/article/details/107591823