在同一个方法中,由于参数类型不同而导致执行效果不同的现象就是多态。类型的强制转换是有条件的,比如这里,animal父类可以强制转换为cat子类,但Dog是无法强制转换为Cat的
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");
}
}
}