1. 什么是多态?为什么要用多态?
a) 多态是Java面向对象的三大特性(封装、继承、多态)之一。封装和继承几乎都是为多态而准备的。
b) 多态的定义: 指允许不同类的对象对同一消息做出的响应。即同一消息可以根据发送对象的不同而采取多种不同的行为方式。
c) 在java中存在多态的现象有:
i. 方法的重载
ii. 方法的重写
iii. 转型(向上转型,和向下转型)
iv. 接口
v. 抽象类
2. 多态的作用
a) 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。
b) 派生类的的功能可以被基类方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。
c) 概括的说多态就是为了消除类型之间的耦合关系。
3. 多态存在的三个必要条件
a) 要有继承;(发生在基类与子类之间:转型,接口,抽象类)
b) 要有重写;(发生在同一个类中)
c) 父类引用指向子类对象;
4. 多态的一些现象
a) 方法的重载:
例子:问题描述:写一个类实现整型,长整型,浮点型,双精度浮点型,字符串的相加。
1 public class Addition { 2 /** 3 * 两整数相加 4 * 5 * @param num1 6 * @param num2 7 * @return 8 */ 9 public static int add(int num1, int num2) { 10 return num1 + num2; 11 } 12 13 /** 14 * 两个双精度浮点数相加 15 * 16 * @param num1 17 * @param num2 18 * @return 19 */ 20 public static double add(double num1, double num2) { 21 return num1 + num2; 22 } 23 24 /** 25 * 两个长整型数相加 26 * 27 * @param num1 28 * @param num2 29 * @return 30 */ 31 public static long add(long num1, long num2) { 32 return num1 + num2; 33 } 34 35 /** 36 * 两个浮点数相加 37 * 38 * @param num1 39 * @param num2 40 * @return 41 */ 42 public static float add(float num1, float num2) { 43 return num1 + num2; 44 } 45 46 /** 47 * 两个字符串相加 48 * 49 * @param num1 50 * @param num2 51 * @return 52 */ 53 public static String add(String num1, String num2) { 54 return num1 + num2; 55 } 56 57 }
重载的特点:
->发生在同一个类中
->出现了方法名相同,参数列表不同(参数的个数,参数类型,参数顺序)
b) 方法的重写
例子:写一个基类Vehicle可以行驶(run),可以停止(stop)。再写一个自行车类(bike)继承自基类Vehicle,重写行驶(run),和停止(stop)
1 /** 2 * 交通工具类 3 * @author Administrator 4 * 5 */ 6 public class Vehicle { 7 8 9 public void run(){ 10 System.out.println("交通工具可以行驶."); 11 } 12 13 public void stop(){ 14 System.out.println("交通工具可以停止."); 15 } 16 }
1 /** 2 * 3 * @author Administrator 4 * 5 */ 6 public class Bike extends Vehicle{ 7 8 /* 9 * 实现了run方法的重写 10 * (non-Javadoc) 11 * @see com.test.www.Vehicle#run() 12 */ 13 @Override 14 public void run() { 15 System.out.println("自行车可以骑着行驶."); 16 } 17 18 /* 19 * 实现了stop方法的重写 20 * (non-Javadoc) 21 * @see com.test.www.Vehicle#stop() 22 */ 23 @Override 24 public void stop() { 25 System.out.println("自行车脚磨擦地面停止."); 26 } 27 28 }
重写的特点
->发生在父类和子类之间,在子类中出现与父类重名的方法
->方法名,参数列表,和返回值都相同。方法体不相同。
->子类重写的方法的访问控制权限不能严于父类。(比如:父类的run方法的访问权限是public,那么子类的run方法的访问权限就不能是private,protected.)
c) 转型
例子:
1 /** 2 * 基类 3 * @author Administrator 4 * 5 */ 6 public class Animal { 7 int legs; 8 public void eat(){ 9 System.out.println("吃饭"); 10 } 11 }
1 public class Cat extends Animal { 2 @Override 3 public void eat() { 4 System.out.println("猫吃鱼"); 5 } 6 7 public void catchM(){ 8 System.out.println("猫抓鱼"); 9 } 10 }
1 public class Dog extends Animal { 2 @Override 3 public void eat() { 4 System.out.println("狗追着咬猫"); 5 } 6 7 public void lookDoor(){ 8 System.out.println("看大门"); 9 } 10 11 }
1 public class Test { 2 3 public static void f1(Animal animal){
//父类引用子类对象,调用的是子类的方法
//向上转型(即子类向父类转型,这是一种自动转型。向后兼容,父类引用子类方法) 多态的一种形式 4 animal.eat(); 5 if(animal instanceof Cat){ 6 //下转型(父类向子类转型,这是一种强制转型) 7 ((Cat) animal).catchM(); 8 } 9 if(animal instanceof Dog){ 10 ((Dog) animal).lookDoor(); 11 } 12 } 13 14 public static void main(String[] args) { 15 Animal myDog=new Dog();//多态的一种形式 16 Animal myCat=new Cat(); 17 18 f1(myDog); 19 f1(myCat); 20 } 21 }
转型总结:
->上转型:从子类向父类转型(自动类型转换)(向后兼容,父类引用子类方法)
->下转型:从父类向子类转型 (强制类型转换)