面向对象第三大特征:多态
多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态。
编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。
一个程序跑起来需要经过编译→运行。而多态是一种运行期的行为,不是编译期的行为。
多态的存在要有3个必要条件
【多态 示例1】
1 package com.gta.testoop.polymorphism; 2 3 public class Animal { 4 public void voice(){ 5 System.out.println("普通动物叫声!"); 6 } 7 } 8 9 class Cat extends Animal{ 10 //方法重写 11 public void voice() { 12 System.out.println("喵喵喵~"); 13 } 14 } 15 16 class Dog extends Animal{ 17 //方法重写 18 public void voice() { 19 System.out.println("汪汪汪~"); 20 } 21 } 22 23 class Pig extends Animal{ 24 //方法重写 25 public void voice() { 26 System.out.println("哼哼哼~"); 27 } 28 }
测试类:
(如果没有采用多态,如下所示)
1 public class Test { 2 //如果没有多态,采用方法重载 3 public static void testAnimalVoice(Cat c){ 4 c.voice(); 5 } 6 7 public static void testAnimalVoice(Dog d){ 8 d.voice(); 9 } 10 11 public static void testAnimalVoice(Pig p){ 12 p.voice(); 13 } 14 15 public static void main(String[] args) { 16 // TODO Auto-generated method stub 17 Cat c=new Cat(); 18 testAnimalVoice(c); 19 } 20 21 }
采用多态,如下所示:
1 public class Test { 2 //采用多态 3 public static void testAnimalVoice(Animal a){//Animal是a的编译时类型 4 a.voice(); 5 } 6 7 public static void main(String[] args) { 8 //①向上类型转换 9 Cat c=new Cat();//创建一个Cat对象c,Cat是Animal的子类; 10 // Animal a=c; 11 testAnimalVoice(c);//Cat是运行时类型,实际是执行Animal a=c;再执行testAnimalVoice方法。 12 13 //上面①等价于②:向下类型转换 14 Animal c1=new Cat();//父类引用指向子类对象 15 testAnimalVoice(c1); 16 17 } 18 }
如果子类有新方法:
则:
此处报错,Animal没有编译。Animal类里没有catchMouse方法,c1引用是Animal类,所以找不到该方法,编译通不过。
可以采用强制转型,将c1再转回Cat型。
多态:父类型的引用可以指向子类型的对象。
比如 Parent p = new Child();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;
如果有,再去调用子类的该同名方法。
(注意此处,静态static方法属于特殊情况,静态方法只能继承,不能重写Override,如果子类中定义了同名同形式的静态方法,它对父类方法只起到隐藏的作用。调用的时候用谁的引用,则调用谁的版本。)
(1)向上类型转换(Upcast):将子类型转换为父类型。
对于向上的类型转换,不需要显示指定,即不需要加上前面的小括号和父类类型名。
(2)向下类型转换(Downcast):将父类型转换为子类型。
对于向下的类型转换,必须要显式指定,即必须要使用强制类型转换。
并且父类型的引用必须指向子类的对象,即指向谁才能转换成谁。
不然也会编译出错:
因为父类引用指向的是Cat类的对象,而要强制转换成Dog类,这是不可能的。
instanceof是Java的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。
下一篇:
原文:http://www.cnblogs.com/Qian123/p/5181577.html