• 理解多态


    //为什么要上转型

    //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);
     }
    } ///:~

  • 相关阅读:
    What are the difference between DDL, DML and DCL commands?
    Dingjun123 :使用Partitioned Outer Join实现稠化报表
    Oracle Clusters
    Google实验室能力倾向测试(第一题及解答)
    搜索系统中基于字典的逆向中文分词
    vc++ 深入浅出 窗口创建过程
    计算机网络基础知识1
    线性代数学习之对称矩阵与矩阵的SVD分解
    珍爱生命
    str2hash
  • 原文地址:https://www.cnblogs.com/gaoxiangde/p/4379916.html
Copyright © 2020-2023  润新知