• Java多态案例分析


    一、多态的定义

    同一事物,在不同时刻体现出不同状态。

    例如:水在不同状态可能是:气态、液态、固态。

    二、多态前提和体现

    1、有继承关系

    2、有方法重写

    3、有父类引用指向子类对象

    三、编译运行原理

    1、编译看左边,父类是否有此方法,没有就报错。

    2、运行看右边,运行结果一般是右边子类重写后的结果。

    四、案例分析

     1 package polymorphic;
     2 /**
     3  * 多态案例1,基础
     4  * @author zhongfg
     5  * @date 2015-06-16
     6  */
     7 interface Car {
     8     
     9     public abstract String getName();
    10     
    11     public abstract int getPrice();
    12 }
    13 
    14 class Benz implements Car {
    15 
    16     @Override
    17     public String getName() {
    18         // TODO Auto-generated method stub
    19         return "BENZ";
    20     }
    21 
    22     @Override
    23     public int getPrice() {
    24         // TODO Auto-generated method stub
    25         return 300000;
    26     }
    27 
    28 }
    29 
    30 class Bmw implements Car {
    31 
    32     @Override
    33     public String getName() {
    34         // TODO Auto-generated method stub
    35         return "BMW";
    36     }
    37 
    38     @Override
    39     public int getPrice() {
    40         // TODO Auto-generated method stub
    41         return 250000;
    42     }
    43     
    44 }
    45 
    46 class CarShop {
    47     
    48     public void carInfo(Car car){
    49         System.out.println("品牌:"+car.getName()+",价格:"+car.getPrice());
    50     }
    51 }
    52 
    53 public class PolymorphicDemo {
    54     public static void main(String[] args) {
    55         
    56         CarShop cs = new CarShop();
    57         //传递的是Benz的对象
    58         Car car = new Benz();
    59         cs.carInfo(car);
    60         
    61         //传递的是Bmw的对象
    62         car = new Bmw();
    63         cs.carInfo(car);
    64     }
    65 }
    66 
    67 运行结果:
    68 品牌:BENZ,价格:300000
    69 品牌:BMW,价格:250000
    View Code
     1 package polymorphic;
     2 /**
     3  * 多态案例2,转型问题
     4  * @author zhongfg
     5  * @date 2015-06-16
     6  */
     7 abstract class Animal {
     8     
     9     public abstract void eat();
    10 }
    11 
    12 class Dog extends Animal {
    13     
    14     public void eat(){
    15         System.out.println("狗吃肉");
    16     }
    17     
    18     public void lookDoor(){
    19         System.out.println("狗看门");
    20     }
    21 }
    22 
    23 class Cat extends Animal {
    24     
    25     public void eat() {
    26         System.out.println("猫吃鱼");
    27     }
    28     
    29     public void playGram() {
    30         System.out.println("猫玩游戏");
    31     }
    32 }
    33 
    34 public class PolymorphicTest {
    35 
    36     public static void main(String[] args) {
    37         //内存中是狗,向上转型
    38         Animal a = new Dog();
    39         a.eat();
    40         //向下转型
    41         Dog d = (Dog)a;
    42         d.lookDoor();
    43         
    44         System.out.println("------------------");
    45         
    46         //内存中是猫,向上转型
    47         a = new Cat();
    48         a.eat();
    49         //向下转型
    50         Cat c = (Cat)a;
    51         c.playGram();
    52         
    53         //java.lang.ClassCastException,内存中的猫不能转换成狗
    54 //        Dog d2 = (Dog)a;
    55     }
    56 }
    57 
    58 运行结果:
    59 狗吃肉
    60 狗看门
    61 ------------------
    62 猫吃鱼
    63 猫玩游戏
    View Code
  • 相关阅读:
    python17 .导模块的细节 包的概念 包中的相对导入语法 包的管理 _init_py文件的使用
    @lazy注解
    @Scope注解
    @ComponentScan 注解
    Spring IOC
    Spring体系
    java守护线程
    java线程优先级
    java线程生命周期
    java线程中start和run的区别
  • 原文地址:https://www.cnblogs.com/zfg-technology/p/4580356.html
Copyright © 2020-2023  润新知