一、多态的概念
多态的概念:通俗来说,就是多种形态,
具体点就是去完成某个行为,当不同的对象去完成时会产生出不同 的状
态。
通俗来说,一件事情发生在不同对象身上,就会产生不同的结果。这就好比同样是打印机,彩色打印机和黑白打印机打印出来的效果却不同。
二、多态实现的重要条件
1.必须在继承体系下,发生向上转型
向上转型:实际就是创建一个子类对象,将其当成父类对象来使用。
其三个用法如下:
1. 直接赋值
2. 方法传参
3. 方法返回
2.子类必须要对父类中方法进行重写
3.通过父类的引用调用重写的方法
我们用代码的形式来分析:
class Animal {
String name;
int age;
public Animal(String name,int age) {
this.name = name;
this.age = age;
}
public void eat() {
System.out.println(name + "吃食物");
}
}
class Dog extends Animal {
@Override
public void eat() {
System.out.println(name + "吃骨头");
}
public Dog(String name,int age) {
super(name,age);
}
}
public class Test {
public static void main(String[] args) {
Animal animal = new Dog("小虎",11);//1.直接赋值
animal.eat();
Dog dog = new Dog("小黑",12);
eatFood1(dog);
Animal a = eatFood2(dog);
}
//2.作为函数参数
public static void eatFood1(Animal animal) {
animal.eat();
}
//3.作为函数返回值
public static Animal eatFood2(Dog dog) {
return dog;
}
}
向上转型:
子类中对父类方法重写:
通过父类引用调用重写方法:
三、动态绑定与静态绑定
1.重写与重载
重写
:也称为覆盖。重写是子类对父类非静态、非
private
修饰,非
fifinal
修饰,非构造方法等的实现过程进行重新编写,
返回值和形参都不能改变
。
即外壳不变,核心重写!
重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。重载中:
1.子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型
方法名 (参数列表) 要完全一致
2.被重写的方法返回值类型可以不同,但是必须是具有父子关系的
3.访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被
public
修饰,则子类中重写该方法就不能声明为 protected
4.父类被
static
、
private
修饰的方法、构造方法都不能被重写。
5.重写的方法
,
可以使用
@Override
注解来显式指定
.
有了这个注解能帮我们进行一些合法性校验
.
例如不小心 将方法名字拼写错了 (
比如写成
aet),
那么此时编译器就会发现父类中没有
aet
方法
,
就会编译报错
,
提示无法构成重写
重载:在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了。重载中:
1.方法名必须相同
2. 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
3.
与返回值类型是否相同无关
3.
2.动态绑定与静态绑定的概念
静态绑定
:也称为前期绑定
(
早绑定
)
,即在编译时,根据用户所传递实参类型就确定了具体调用那个方法。典型代表函数重载。
动态绑定
:也称为后期绑定
(
晚绑定
)
,即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体调用那个类的方法。
3.动态绑定是实现多态的基础
其实,在完成实现多态的三个条件时,就实现了动态绑定,动态绑定是实现多态的基础。在底层的代码中,在编译时在调用重写方法,调用的是父类的代码,而在代码编译后的运行阶段则调用的是子类的重写方法!!!所以动态绑定也称之为运行时绑定。
而如方法重载这样的代码,在调用时根据输入的形参就可以确认调用的是哪个重载方法,在编译阶段就已经可以确认调用!!!所以,方法重载是一种静态绑定的体现,而静态绑定也可以称之为编译时绑定。
四、总结
在学习多态的过程中,牢记实现多态的三个要点,即1.继承关系上的向上转型
2.子类和父类有同名的重写方法
3.通过父类对象的引用调用该重写方法
其次将动态绑定与静态绑定之间的关系捋清楚,完成多态的三个条件就是完成了动态绑定,同时捋清楚重写与重载的关系。