关于多态的简单理解
interface Animal{//接口,父类 void shout(); } //用不同的方式来实现接口 class Cat implements Animal{//实现接口,子类 public void shout(){ System.out.println("猫叫,miao miao miao miao miao"); } } class Dog implements Animal{//实现接口,子类 public void shout(){ System.out.println("狗叫,wang wang wang wang wang"); } } public class Example20{ public static void main(String[] args){ Animal an1=new Cat(); //Animal是父类型,Cat是子类型,父类型的变量引用子类型的对象,根据子类型的特征不同,会得到不同的执行结果 Animal an2=new Dog();//在同一个方法中,这种由于参数类型不同而导致执行效果不同的现象就是多态 animalShout(an1); animalShout(an2); } public static void animalShout(Animal an){ //定义animalShout方法接收传入的参数,类型为Animal an.shout();//调用实际参数的shout方法,这里的shout是Cat和Dog中的shout,Animal是抽象类不支持调用 } } //Animal an1=new Cat() 将Cat对象当作Animal类型来使用,将子类对象当作父类类型使用不需要显式的声明 //重温下对象的含义:定义一个Animal类型的变量an1,并且将对象Cat赋值给an1,一般创建A对象,变量类型为A,但也可以创建B对象(B是A的子类),变量类型为A
//数据类型的转换 interface Animal{ void shout(); } class Cat implements Animal{ public void shout(){ System.out.println("miao miao"); } void sleep(){//在实例了父类中已有方法后,子类增加了一个方法 System.out.println("cat sleep……"); } } class Dog implements Animal{ public void shout(){ System.out.println("wang wang"); } } public class Example21{ public static void main(String[] args){ Cat cat=new Cat(); Dog dog=new Dog(); animalShout(cat); animalShout(dog);//如果这里不传入cat,而是传入一个其他类型,后面的强制转换将无法进行,系统会报错,可以用instanceof来加以判断 }//(强制转换是有条件的,比如这里,animal父类可以强制转换为cat子类,但Dog是无法强制转换为Cat的) //public static void animalShout (Animal animal){ // animal.shout(); // animal.sleep();//如此是不能调用的,因为类型不符,因为Animal父项类型中并没有sleep方法,如上的animal.shout()是可以的,因此如下,要进行类型转换 //} public static void animalShout (Animal animal){ //定义传入的参数为Animal类型 if(animal instanceof Cat){//判断传入的参数无法进行强制转换时,友好提示 Cat cat =(Cat) animal; // 将animal参数强制转换为Cat类型,因为在Cat类中,有sleep这个方法,因此后边的sleep得以调用 cat.shout(); cat.sleep(); }else{ System.out.println("this animal is not a cat"); } } }