@Java入门基础 多态 1.多态概述 在同一个方法中,由于参数类型不同而导致执行效果各异的现象就是多态; 在Java中为了实现多态,允许使用一个父类类型的变量来引用一个子类类型的对象,根据被引用子类对象特征的不同,得到不同的运行结果; 例如:
Animal a = new Cat();
要实现一个动物叫的方法,由于每种动物的叫声是不同的,因此可以在方法中接收一个动物类型的参数,当传入猫类对象的叫声时就发出猫类的叫声,传入犬类对象的叫声时就发出犬类的叫声; 例如: Example1:
//定义接口Animal interface Animal{ void shout();//定义抽象shout()方法 } //定义cat类实现Animal接口 class Cat implements Animal{ //实现shout()方法 public void shout(){ System.out.println("miaomiao"); } } //定义Dog类实现Animal接口 class Dog implements Animal{ //实现shout()方法 public void shout(){ System.out.println("wangwang"); } } //定义测试类 public class Example1{ public static void main(String[] args) { Animal an1 = new Cat();//创建Cat对象,使用Animal类型的变量an1 Animal an2 = new Dog();//创建Dog对象,使用Animal类型的变量an2 animalShout(an1);//调用animalShout()方法,将an1作为参数传入 animalShout(an2);//调用animalShout()方法,将an2作为参数传入 } //定义静态的animalShout()方法,接收一个Animal类型的参数 public static void animalShout(Animal an){ an.shout();//调用实际参数的shout()方法 } }父类引用两个不同的子类对象分别调用animalShout()方法,打印出不同的结果。多态不仅解决了方法同名的问题,而且使程序变得更灵活,从而有效的提高程序的可扩展性和可维护性。 2.对象的类型转换
子类向父类转换为隐式转换父类向子类转换为强制类型转换当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,不可以访问子类中特有的方法。 例如: Example2:
interface Animal{ void shout(); } class Cat implements Animal{ public void shout(){ System.out.println("miaomiao"); } public void sleep(){ System.out.println("cat is sleeping"); } } public class EXample2 { public static void main(String[] args) { Cat cat = new Cat(); animalShout(cat); } public static void animalShout(Animal animal){ animal.shout(); animal.sleep(); } }运行结果: main方法中,Cat对象被当作父类Animal类型使用。但Animal类中没有定义sleep()方法;提示错误信息; 将animalShout()方法进行修改
public static void animalShout(Animal animal){ Cat cat = (Cat) animal;//将animal对象强制转换为Cat类型 cat.shout();//调用cat的shout()方法 cat.sleep();//调用cat的sleep()方法 }运行结果如下:
Example3:
interface Animal{ void shout(); } class Cat implements Animal{ public void shout(){ System.out.println("miaomiao"); } void sleep(){ System.out.println("cat is sleeping"); } } class Dog implements Animal{ public void shout(){ System.out.println("wangwang"); } } public class Example132 { public static void main(String[] args) { Dog dog = new Dog(); animalShout(dog); } public static void animalShout(Animal animal){ Cat cat = (Cat) animal; cat.shout(); cat.sleep(); } }在运行时报错,提示Dog类型不能转换成Cat类型,出错的原因是,在调用animalShout()方法时,传入一个Dog对象,在强制类型转换时,Animal类型的变量无法强转为Cat类型; 因此,引入一个instanceof,它可以判断一个对象是否为某个类的实例或者子类实例;
对象(或者对象引用变量)instanceof 类(或接口)
修改后:
public static void animalShout(Animal animal){ if(animal instanceof Cat) { Cat cat = (Cat) animal; cat.shout(); cat.sleep(); }else { System.out.println("this animal is not a cat"); } }运行结果: 使用instanceof 关键字判断animalShout()方法中传入的对象是否为Cat类型,如果是Cat()类型就进行强制类型转换,否则就打印"this animal is not a cat";