面向对象的第三大特征就是多态(Ploymorphism)
- 多态的实现条件
Java实现多态的必要条件:继承、重写,当编译时类型和运行时类型不一致,就会出现多态。
父类声明的变量可以引用所有子类的对象,这是多态实现的基础;我们只有在运行的时候才会知道引用变量所指向的具体实例对象。 - 多态的作用
把不同的子类对象都当作父类对象;来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。简而言之,就是用父类或接口的引用变量指向子类的对象 - 应注意的问题
(1)、静态方法不能被重写,所以静态方法没有多态性
(2)、成员变量不具备多态性,成员变量的值取决于引用属性的类
(3)、成员方法编译时应先检查引用变量所属类中是否有调用的方法;运行时调用的实际对象是所属类中的重写方法。
(4)、一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中特有的属性和方法 - 案例
动物类(父类)
public class Animal {
public void shout(){
System.out.println("动物在叫");
}
public void eat(String food){
System.out.println("在吃"+food);
}
}
猫类和狗类(子类)
//猫类
public class Cat extends Animal{
@Override
public void shout() {
System.out.println("喵喵");
}
}
//狗类
public class Dog extends Animal{
@Override
public void shout() {
super.shout();
System.out.println("汪汪汪");
}
@Override
public void eat(String food) {
System.out.println("小狗爱吃骨头,不爱吃"+food);
}
}
测试类
public class Test {
//多态的条件:继承和重写;适用于方法,不用于属性
public static void main(String[] args) {
//正常情况
Animal animal = new Animal();
animal.shout();
Dog dog = new Dog();
dog.shout();
Cat cat = new Cat();
cat.shout();
//多态
Animal a = new Dog();
a.shout(); //此时调用的还是Animal里面默认的方法
Dog d = (Dog) a; //强制类型转换
d.shout(); //此时就可以调用重写的shout方法了
Animal an = new Cat();
Cat c = (Cat)an;
c.shout();
//传入参数的多态
test(animal);
test(c);
test(d);
}
public static void test(Animal animal){
animal.shout();
}
public static Animal test1(Animal animal){
//返回值的多态:可以返回d2,也可以返回c2
// Dog d2=new Dog();
// return d2;
Cat c2 = new Cat();
return c2;
}
}