java基础复习 之 多态

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 }

    转型总结:

      ->上转型:从子类向父类转型(自动类型转换)(向后兼容,父类引用子类方法)

      ->下转型:从父类向子类转型 (强制类型转换)

原文地址:https://www.cnblogs.com/ztg-learn/p/7337431.html