多态
-
同一个行为具有不同表现形式或形态的能力。即不同的对象对于同一个行为呈现出不同的执行结果。
-
多态的实现方法、重载、继承、重写、父类引用子类对象以及方法绑定。
-
引用多态
①父类的引用可以指向本类的对象
②父类的引用可以指向子类的对象 -
方法多态
①创建本类对象时,调用的方法为本类方法
②创建子类对象时调用的方法为子类重写的方法,或者继承 -
子类要重写父类中的方法也叫覆盖。子类在继承父类时,重写父类中的方法,在调用方法时,子类会调用实际类型中的方法。
-
向上转型:将小类型转换为大的类型
-
向下转型:类型1 instanceof 类型2,返回boolean型。如果结果为true,代表类型1;否则代表类型2。一般与if语句一起用
代码如下
- 父类代码
public abstract class Pet {
public abstract void eat();
} - 子类代码
Dog子类
public class Dog extends Pet{
public void eat(){
System.out.println(“狗喜欢吃骨头”);
}
public void sound(){
System.out.println(“狗会汪汪叫”);
}
}
Penguin子类
public class Penguin extends Pet{
public void eat(){
System.out.println(“企鹅喜欢吃鱼”);
}
public void swimming(){
System.out.println(“企鹅会游泳”);
}
}
主人实现调用代码
public class Master {
public void weishi(Pet pet){
//主人给宠物喂食
pet.eat();
}
public void descBehavior(Pet pet){
//主人描述宠物的行为
boolean flag = (pet instanceof Dog);
System.out.println(flag); if(flag){
((Dog)pet).sound();
}else{
((Penguin)pet).swimming();
}
}
public static void main(String[] args) {
Master man = new Master();
Dog dog = new Dog(); man.weishi(dog);
Penguin penguin = new Penguin();
man.weishi(penguin );
Pet dog1 = new Dog();//声明类型大于实例类型,所以是向上转型
((Dog) dog1).sound(); //向下类型转换
Dog dog2 = new Dog(); man.descBehavior(dog2);
Penguin penguin1 = new Penguin(); man.descBehavior(penguin1);
}
}
注意:当声明类型与实例类型不一样时:在调用a()方法时,系统会首先检查声明类型中有没有a()方法, 如果有,则去实际类型中检查是否有a()方法,如果有则调用实际类型中的方法。