1.多态的概念
多态意味着允许不同类的对象对同一消息做出不同的响应,分为
- 编译时多态(设计时多态 方法重载)
- 运行时多态(程序运行时动态决定调用哪个方法)
一般在Java程序当中所说到的多态大多指的就是运行时多态。
2.多态的必要条件
- 满足继承关系
- 父类引用指向子类对象
3.向上转型、向下转型、instanceof
package com.imooc.poly;
public class Animal {
private String name;
private int age;
//构造方法
public Animal(){
}
public void eat(){
System.out.println("动物吃东西");
}
}
package com.imooc.poly;
public class Cat extends Animal{
public Cat(){
}
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void say(){
System.out.println("猫说");
}
}
package com.imooc.poly;
public class Dog extends Animal{
public Dog(){
}
@Override
public void eat() {
System.out.println("狗吃肉");
}
public void sleep() {
System.out.println("狗睡午觉");
}
}
package com.imooc.poly;
public class Test {
public static void main(String[] args) {
Animal one = new Animal();
/*
1.向上转型(又称隐式转型,自动转型)
2.表示父类引用指向子类实例,可以调用子类重写父类的方法以及父类派生的方法,无法调用子类独有的方法
3.小类转化为大类
*/
Animal two = new Cat();//表示父类引用指向子类实例
Animal three = new Dog();//表示父类引用指向子类实例
one.eat();
two.eat();//调用子类重写父类的方法
three.eat();//调用子类重写父类的方法
//two.say();//无法调用子类独有的方法
/*
1.向下转型(强制类型转换)
2.子类引用指向父类对象,此处必须进行强转
*/
Cat cat = (Cat) two;
cat.eat();
cat.say();
//我们看猫对象能否转为狗对象,很明显是不能的,因为他们两个只是Animal的两个子类
//Dog dog = (Dog) cat; 错误的
/*
instanceof:判断左侧对象是否有右侧对象的特征 ,返回true/false
*/
if(three instanceof Dog){ //因为three这个引用实际指向的是Dog的实例,而它之所以具有Animal的特征,是因为Animal是Dog的父类
Dog dog = (Dog) three;
dog.sleep();
}
}
}
4.抽象类和抽象方法
abstract定义抽象类和抽象方法
- 抽象类不允许实例化,但可以通过向上转型,指向子类实例
- 应用场景:某个父类只是知道子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法
- 抽象方法没有方法体,子类继承后须重写父类的这些方法
- 包含抽象方法的类一定是抽象类
- 抽象类中可以不包含抽象方法
- static final private 不能与abstract并存,因为我们的抽象方法需要在子类中进行重写,而private修饰后只能在当前类访问,final修饰后方法不能被重写,static不能修饰类!