zoukankan      html  css  js  c++  java
  • 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 }

        转型总结:

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

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

  • 相关阅读:
    Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (gbk_chinese_ci,COERCIBLE) for operation '=' 一个解决办法(转载)
    mysql limit用法
    preparedStatement一个小技巧
    两个简单的压力测试代码。
    cookie实现session机制
    java.util.properties用法
    数据库是否使用外键,及视图,索引,存储过程的一些说明(zz)
    某项目要调用现有的100多个DLL 二 最最简单原型的思考
    面试题:红绿灯
    一个简单的封装 .net的日志功能
  • 原文地址:https://www.cnblogs.com/ztg-learn/p/7337431.html
Copyright © 2011-2022 走看看