java笔记_多态的相关使用
多态
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);