面向对象的三大特征:封装、继承、多态。
规则: 父类类型 对象名称 = new 子类构造器 或者 接口 对象名称 = new 实现类构造器
概念: 同一个类型的对象,执行同一个行为,在不同的状态下会表现出不同的行为特征。
/**
* 多态测试
*/public class Demo {
public static void main(String[] args) {
//都是属于Animal对象
Animal Dog = new Dog();
//都执行eat行为表现出不同的行为特征
dog.eat();
Animal cat = new Cat();
cat.eat();
}
}
/**
* Cat子类
*/class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
/**
* Dog子类
*/class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
/**
* 父类
*/class Animal{
public void eat(){
System.out.println("动物吃东西");
}
}
运行结果:
条件:
1.必须存在继承或者实现关系。
2.必须是父类类型变量引用子类类型的对象。
3.需要存在方法重写。
优点: 子类对象的改变,业务功能也随之改变,便于功能的扩展和维护,可以实现类与类之间的 解耦 。
/**
* 多态测试
*/public class Demo {
public static void main(String[] args) {
//都是属于Animal对象
Animal dog = new Dog();
//都执行eat行为表现出不同的行为特征
dog.eat();
Animal cat = new Cat();
cat.eat();
go(dog);
go(cat);
}
/**
* 使用父类类型对象作为形参,可以灵活的传入子类类型的对象
* 从而实现不同的行为特征
* @param animal
*/ public static void go(Animal animal){
System.out.println("begin");
animal.eat();
System.out.println("done");
}
}
/**
* Cat子类
*/class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
/**
* Dog子类
*/class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
/**
* 父类
*/class Animal{
public void eat(){
System.out.println("动物吃东西");
}
}
缺点: 多态情况下,不能直接调用子类特有的功能,因为父类没有。 但是也有解决办法,就是父类对象强制转换为子类对象然后调用子类特有的方法。