多态性
1、什么是多态?
-
多态是同一个行为具有多个不同表现形式或形态的能力。
-
指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。
-
对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)
2、多态的优点:
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
3、实现多态的技术:
动态绑定,是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
4、多态存在的三个必要条件:
- 要有继承
- 要有重写
- 父类引用指向子类对象
Parent p=new Child();
//当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译失败;如果有,再去调用子类的同名方法
5、多态的使用:虚拟方法的调用
- 当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法。
- 了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
- 总结:编译,看左边;运行,看右边。
import OOPextends.AnimaslTest;
public class AnimalTest {
public static void main(String[] args) {
AnimalTest test=new AnimalTest();
//虚拟方法
Animal dog=new Dog();
test.func(dog);
}
public void func(Animal animal){
animal.eat();
animal.shout();
}
}
//父类
class Animal{
//父类方法的重写
public void eat(){
System.out.println("动物:进食");
}
public void shout(){
System.out.println("动物:叫");
}
}
//子类1
class Dog extends Animal{
//父类方法的重写
public void eat(){
System.out.println("狗吃骨头");
}
public void shout(){
System.out.println("汪!汪!汪!");
}
}
//子类2
class Cat extends Animal{
public void eat(){
System.out.println("猫吃鱼");
}
public void shout(){
System.out.println("喵!喵!喵");
}
}
6、对象的多态性,只适用于方法,不适用属性(编译和运行都看左边)
//父类
public class Person {
String name;
int age=10;//此处age=10
public void eat(){
System.out.println("人要吃饭");
}
public void sleep(){
System.out.println("人要睡觉");
}
}
public class Man extends Person{
boolean isSmoking;
int age=12;//此处age=12
public void earnMoney(){
System.out.println("男人挣钱");
}
public void eat(){
System.out.println("男人要多吃饭");
}
public void sleep(){
System.out.println("男人要睡觉");
}
}
public class PersonTest {
public static void main(String[] args) {
Person p=new Man();
//输出结果表示对象的多态性不适用属性
System.out.println(p.age);//输出为:10
}
}
7、多态是运行时行为
8、多态的实现方式:
- 重写
- 接口
- 抽象类和抽象方法