zoukankan      html  css  js  c++  java
  • Java: 多态

    多态:

      可以理解为事物存的多种体现形态。

    1,多态的体现
      父类的引用指向了自己的子类对象
      父类的引用也可以接受自己的子类对象

    2,多态的前提
      必须是类与类之间有关系,要么继承,要么实现接口
      通常还有一个前提:存在覆盖

    3,多态的好处
      多态的出现提高了程序的扩展性

    4,多态的弊端
      只能使用父类的引用访问父类的成员

    5,多态的应用

    转型:

      向上转型:可以把子类对象的引用指向给父类对象

      向下转型:可以使用子类的特殊功能,但前提是父类的引用也是该子类的对象,也就是说始终做着变化的是子类对象的引用

     1 /*
     2 动物:猫,狗
     3 
     4 */
     5 
     6 abstract class Animal
     7 {
     8     public abstract void eat();
     9 }
    10 
    11 class Cat extends Animal
    12 {
    13     public void eat()
    14     {
    15         System.out.println("吃鱼");
    16     }
    17     public void catchMouse()
    18     {
    19         System.out.println("抓老鼠");
    20     }
    21 }
    22 
    23 class Dog extends Animal
    24 {
    25     public void eat()
    26     {
    27         System.out.println("啃骨头");
    28     }
    29     public void watchDoor()
    30     {
    31         System.out.println("看家");
    32     }
    33 }
    34 
    35 class Pig extends Animal
    36 {
    37     public void eat()
    38     {
    39         System.out.println("吃饲料");
    40     }
    41     public void gongDi()
    42     {
    43         System.out.println("拱地");
    44     }
    45 }
    46 
    47 class DuoTaiDemo 
    48 {
    49     public static void main(String[] args) 
    50     {
    51         Cat c = new Cat();
    52         //c.eat();
    53         function(c);
    54         c.catchMouse();
    55 
    56         Dog d = new Dog();
    57         //d.eat();
    58         function(d);
    59         d.watchDoor();
    60 
    61         function(new Pig());
    62 
    63         System.out.println("上面是普通使用,下面是多态");
    64         Animal aCat = new Cat();//类型提升,向上转型
    65         function(aCat);
    66         Cat bCat = (Cat)aCat;//强制将父类的引用,转成子类类型,向下转型
    67         bCat.catchMouse();
    68 
    69         Animal aDog = new Dog();
    70         function(aDog);
    71         Animal aPig = new Pig();
    72         function(aPig);
    73     }
    74 
    75     public static void function(Animal a)
    76     {
    77         a.eat();
    78     }
    79 }

    多态成员函数的特点:

      在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,反之失败;

      在运行时期:参阅对象所属的类中是否有调用的方法。

      简单总结就是:成员函数在多态调用时,编译看左边,运行看右边

    多态成员变量的特点:

      无论编译和运行都参考左边(引用型变量所属的类)

    多态静态成员函数的特点:

      无论编译和运行都参考左边

  • 相关阅读:
    Linux文本处理
    鲜为人知的maven标签解说
    springboot整合websocket高级版
    springboot整合swagger。完爆前后端调试
    java的干儿子锁Lock
    AbstractQueuedSynchronizer(AQS)抽丝剥茧深入了解JUC框架原理
    【优雅写代码系统】springboot+mybatis+pagehelper+mybatisplus+druid教你如何优雅写代码
    居然还有人这样解说mybatis运行原理
    mybatis精讲(七)--动态sql
    基于redis实现分布式锁
  • 原文地址:https://www.cnblogs.com/siyingcheng/p/4302269.html
Copyright © 2011-2022 走看看