父类型可以指向子类型对象
多态可以降低系统的耦合性
除了父类型可以指向子类型,还可以实现的接口指向对象
Biology biology = new Cat(); //Cat实例化了接口Biology
缺点:如果使用父类型或者接口 指向子类型或者实现类 , 那么引用只能调用父类型的方法或者接口中定义的方法
解决方法:向下类型转换,(要判断对象的类型,用instanceof 来了解animal instanceof Dog:)
if( animal instanceof Dog){
Dog dog = (Dog) animal;
dog.jiao();
}
if( animal instanceof Cat){
Cat cat = (Cat) animal;
cat.jiao();
}
if( animal instanceof Snake){
Snake snake = (Snake) animal;
snake.jiao();
}
多态成员访问的特点:
成员变量:
编译看左边(父类),运行看左边(父类)
成员方法:
编译看左边(父类),运行看右边(子类),动态绑定
静态方法:
编译看左边(父类),运行看左边(父类)
只有非静态的成员方法(=成员方法):
编译看左边(父类),运行看右边(子类)
多态的弊端:
不能使用子类特有的成员属性和子类特有的成员方法(具体解决方法:上述代码块)
多态存在的三个必要条件:
1.继承
2.父类应用指向子类对象
3.重写方法(注意,只是方法,如果在子类中重写了父类的变量,那么在编译时会报错)
- 当使用多态方式调用方法时,首先检车父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法
以下是使用多态的例子
public class Test{
public static void main(String args[]){
Animal dog = new Dog();
Animal cat = new Cat();
dog.eat();
Dog d = (Dog)dog;
d.work();
cat.eat();
Cat c = (Cat)cat;
c.work();
public void show(Animal a){
if(a intenceof Dog){
Dog d = (Dog)a;
d.work();
}else if(a intenceof Cat){
Cat c = (Cat)cat;
c.work();
}
}
}
}
Interface Animal{
abstract void eat();
}
class Dog implements Animal{
public void eat(){
System.out.println("狗吃骨头");
}
public void work(){
System.out.println("狗看家");
}
}
class Cat implements Animal{
public void eat(){
System.out.println("猫吃鱼");
}
public vodi work(){
System.out.println("猫抓耗子");
}
}