多态 Java

来源:互联网 发布:php取数组中的最大值 编辑:程序博客网 时间:2024/06/06 17:26

1、定义:

多态性是指允许不同类的对象对同一消息作出响应。可以设计一个方法,参数类型为类或接口(是一个父类类型的变量),传入的参数是一个子类类型的对象,根据引用子类对象特征的不同,得到不同的运行结果。如下面代码:

// 定义接口Anmalinterface Animal {    void shout();     // 定义抽象shout()方法}// 定义Cat类实现Animal接口class Cat implements Animal {// 实现shout()方法public void shout() {System.out.println("喵喵喵");}}// 定义Dog类实现Animal接口class Dog implements Animal {     // 实现shout()方法public void shout() {System.out.println("Dog叫");}}public class Example {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()方法}}
结果:

喵喵喵

Dog叫


2、对象的类型转换

上转型:

子类转型成父类是向上转型,即将子类对象当作父类类型使用,例如下面的代码

Animal an1=new Cat();

子类对象当作父类类型使用不需要任何显示的声明,但此时子类对象失去了子类对象中新添加的特征。如下面代码将会报错。

// 定义Animal接口interface Animal {    void shout(); // 定义抽象方法shout()}// 定义Cat类实现Animal接口class Cat implements Animal {        // 实现抽象方法shout()public void shout() {  System.out.println("喵喵……");}     // 定义sleep()方法void sleep() {System.out.println("猫睡觉……");}}// 定义测试类 public class Example {public static void main(String[] args) {         Cat cat = new Cat(); // 创建Cat类的实例对象animalShout(cat);    // 调用animalShout()方法,将cat作为参数传入}     // 定义静态方法animalShout(),接收一个Animal类型的参数public static void animalShout(Animal animal) {animal.shout();  // 调用传入参数animal的shout()方法animal.sleep();  // 调用传入参数animal的sleep()方法}}
因为上面代码中,Animal类中没有定义sleep()方法,Catl类型对象当作父类Animal类型使用时,Catl类对象失去了子sleep()方法;

但这个问题可以结果,可以将Animal类型的变量强制转为Cat类型。也就是下转型,如下面描述


下转型:

子类转型成父类是向上转型,反过来说,父类转型成子类就是向下转型。如下面代码

public static void animalShout(Animal animal) {Cat cat=(Cat)animal;   // 将Animal对象强制转换成Cat类型       cat.sleep();            // 调用cat的sleep()方法cat.shout();            // 调用cat的shout()方法}
但之所可以这样强制类型转换,是因为调用animalShout()方法时传入的是Cat类型的对象,将Cat类型的对象上转型了,之后可以下转型。若此时传入的是一个Dog类型的对象,这时进行强制类型转换就会出错。如下面的代码。
// 定义Animal类接口interface Animal {    void shout(); // 定义抽象方法shout()}// 定义Cat类实现Animal接口class Cat implements Animal {         // 实现shout()方法public void shout() {  System.out.println("喵喵……");}     // 定义sleep()方法void sleep() {System.out.println("猫睡觉……");}}// 定义Dog类实现Animal接口class Dog implements Animal {     // 实现shout()方法public void shout() {   System.out.println("汪汪……");}}// 创建测试类public class Example15 {public static void main(String[] args) {          Dog dog =new Dog(); // 创建Dog类型的实例对象animalShout(dog);    // 调用animalShout()方法,将dog作为参数传入}     // 定义静态方法animalShout(),接收一个Animal类型的参数public static void animalShout(Animal animal) {Cat cat=(Cat)animal;   // 将Animal对象强制转换成Cat类型 ,这里出错。      cat.sleep();            // 调用cat的sleep()方法cat.shout();            // 调用cat的shout()方法}}


3、关键字instanceof

针对上述强制类型转换出错的情况,Java提供关键字instanceof,它可以判断一个对象是否为某个类或接口的实例或者子类实例。

格式:对象(或者对象引用变量)instanceof 类(或接口) 具体代码如下

public static void animalShout(Animal animal) {if(animal instanceof Cat){Cat cat=(Cat)animal;   // 将Animal对象强制转换成Cat类型       cat.sleep();            // 调用cat的sleep()方法cat.shout();            // 调用cat的shout()方法}else{System.out.println("可以进行强制类型转换");}}

原创粉丝点击