当前位置: 移动技术网 > IT编程>开发语言>Java > java笔记_多态的相关使用

java笔记_多态的相关使用

2020年07月27日  | 移动技术网IT编程  | 我要评论
多态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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网