何为多态:多态既一个方法有两种形态,请看如下代码
静态绑定:在编译时,指向子类的父类对象绑定父类的方法;
class Animal{
String name;
int age;
Animal(){}
void eat(){
System.out.println("动物吃食物");
}
void print(){
}
}
public class Dog extends Animal
{
String hair;
Dog(String name,int age,String hair){
super.name = name;
super.age = age;
this.hair = hair;
}
public static void main(String args[]){
Animal a = new Dog("dog",15,"red") ;//这叫父类向下转型,a是Animal类型的Dog,与Dog类型有区别,a只能调用Aniaml中有的方法
a.print();
a.eat();
}
}
结果如下:
如果我们重写eat()方法及print()方法,那么我们将触发动态绑定:动态绑定必须是基于静态绑定下,既绑定子类方法,请看如下代码
动态绑定
void eat(){System.out.println("狗吃骨头");}
void print(){
System.out.println(super.name+" " +super.age+" " this.hair);
}
结果如下:
如此可见指向子类的父类对象只能调用父类中已有的方法,那么我们如何调用子类特有的方法呢,请看如下代码:
class Animal{
String name;
int age;
Animal(){}
void eat(){
System.out.println("动物吃食物");
}
void print(){
}
}
public class Dog extends Animal
{
String hair;
void eat()
{System.out.println("狗吃骨头");}
void print(){
System.out.println(super.name+" " +super.age+" "+this.hair);
}
void guard(){
System.out.println("狗狗守门");
}
Dog(String name,int age,String hair){
super.name = name;
super.age = age;
this.hair = hair;
}
public static void main(String args[]){
Animal a = new Dog("dog",15,"red") ;
a.print();
a.eat();
Dog b = (Dog)a;//将强转成Dog类型,此时可调用父类中的方法也可调用子类中的方法
b.print();
b.eat();
b.guard();
}
}
结果如下: