zoukankan      html  css  js  c++  java
  • 理解多态

    //为什么要上转型

    //Note.java

    package c07;

    public enum  Note{middleC,cSharp,cFlat;}

    //Music.java

    package c07;

    class Instrument {
    public void play(Note n) {
    System.out.println("Instrument.play()");
    }
    }


    class Wind extends Instrument {
    public void play(Note n) {
    System.out.println("Wind.play()       "+n);
    }
    }


    class Wind2 extends Instrument {
    public void play(Note n) {
    System.out.println("Wind2.play()      "+n);
    }
    }


    public class Music {
    public static void tune(Instrument i) {
    // ...
    i.play(Note.middleC);//关键是这里 i    play  
    }
    public static void main(String[] args) {
    Wind flute = new Wind();
    tune(flute); // Upcasting
    Wind2 flute2 = new Wind2();
    tune(flute2); // Upcasting
    }
    } ///:~

    //不用上转型,很麻烦


    //: Music2.java
    //Overloading instead of upcasting
    class Note2 {
     private int value;
     private Note2(int val) { value = val; }
     public static final Note2
     middleC = new Note2(0),
     cSharp = new Note2(1),
     cFlat = new Note2(2);
    } // Etc.
    class Instrument2 {
     public void play(Note2 n) {
      System.out.println("Instrument2.play()");
     }
    }
    class Wind2 extends Instrument2 {
     public void play(Note2 n) {
      System.out.println("Wind2.play()");
     }
    }
    class Stringed2 extends Instrument2 {
     public void play(Note2 n) {
      System.out.println("Stringed2.play()");
     }
    }
    class Brass2 extends Instrument2 {
     public void play(Note2 n) {
      System.out.println("Brass2.play()");
     }
    }
    public class Music2 {
     public static void tune(Wind2 i) {
      i.play(Note2.middleC);
     }
     public static void tune(Stringed2 i) {
      i.play(Note2.middleC);
     }
     public static void tune(Brass2 i) {
      i.play(Note2.middleC);
     }//相对于上转型是多余的

     public static void main(String[] args) {
      Wind2 flute = new Wind2();
      Stringed2 violin = new Stringed2();
      Brass2 frenchHorn = new Brass2();
      tune(flute); // No upcasting
      tune(violin);
      tune(frenchHorn);
     }
    } ///:~

  • 相关阅读:
    oracle 查询判断语句
    C#后台调用oracle存储过程,参数传入的是clob字段,怎样处理
    devexpress chart 弧度曲线图
    回车键提交与不提交表单的解决方法
    ajax请求在ie下返回undefined
    [PhpStorm]找回Excluded后的目录
    javasript之toString怪异的情况
    强制页面不缓存
    [争论]localhost与127.0.0.1的区别
    Windows下创建空名文件夹
  • 原文地址:https://www.cnblogs.com/gaoxiangde/p/4379916.html
Copyright © 2011-2022 走看看