熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

主類型的過載

2013-11-23 18:39:16  來源: Java核心技術 

  
  主(數據)類型能從一個較小的類型自動轉變成一個較大的類型涉及過載問題時這會稍微造成一些混亂下面這個例子揭示了將主類型傳遞給過載的方法時發生的情況
  
  //: PrimitiveOverloadingjava
  // Promotion of primitives and overloading
  
  public class PrimitiveOverloading {
   // boolean cant be automatically converted
   static void prt(String s) {
    Systemoutprintln(s);
   }
  
   void f(char x) { prt(f(char)); }
   void f(byte x) { prt(f(byte)); }
   void f(short x) { prt(f(short)); }
   void f(int x) { prt(f(int)); }
   void f(long x) { prt(f(long)); }
   void f(float x) { prt(f(float)); }
   void f(double x) { prt(f(double)); }
  
   void f(byte x) { prt(f(byte)); }
   void f(short x) { prt(f(short)); }
   void f(int x) { prt(f(int)); }
   void f(long x) { prt(f(long)); }
   void f(float x) { prt(f(float)); }
   void f(double x) { prt(f(double)); }
  
   void f(short x) { prt(f(short)); }
   void f(int x) { prt(f(int)); }
   void f(long x) { prt(f(long)); }
   void f(float x) { prt(f(float)); }
   void f(double x) { prt(f(double)); }
  
   void f(int x) { prt(f(int)); }
   void f(long x) { prt(f(long)); }
   void f(float x) { prt(f(float)); }
   void f(double x) { prt(f(double)); }
  
   void f(long x) { prt(f(long)); }
   void f(float x) { prt(f(float)); }
   void f(double x) { prt(f(double)); }
  
   void f(float x) { prt(f(float)); }
   void f(double x) { prt(f(double)); }
  
   void f(double x) { prt(f(double)); }
  
   void testConstVal() {
    prt(Testing with );
    f();f();f();f();f();f();f();
   }
   void testChar() {
    char x = x;
    prt(char argument:);
    f(x);f(x);f(x);f(x);f(x);f(x);f(x);
   }
   void testByte() {
    byte x = ;
    prt(byte argument:);
    f(x);f(x);f(x);f(x);f(x);f(x);f(x);
   }
   void testShort() {
    short x = ;
    prt(short argument:);
    f(x);f(x);f(x);f(x);f(x);f(x);f(x);
   }
   void testInt() {
    int x = ;
    prt(int argument:);
    f(x);f(x);f(x);f(x);f(x);f(x);f(x);
   }
   void testLong() {
    long x = ;
    prt(long argument:);
    f(x);f(x);f(x);f(x);f(x);f(x);f(x);
   }
   void testFloat() {
    float x = ;
    prt(float argument:);
    f(x);f(x);f(x);f(x);f(x);f(x);f(x);
   }
   void testDouble() {
    double x = ;
    prt(double argument:);
    f(x);f(x);f(x);f(x);f(x);f(x);f(x);
   }
   public static void main(String[] args) {
    PrimitiveOverloading p =
     new PrimitiveOverloading();
    ptestConstVal();
    ptestChar();
    ptestByte();
    ptestShort();
    ptestInt();
    ptestLong();
    ptestFloat();
    ptestDouble();
   }
  } ///:~
  
  若觀察這個程序的輸出就會發現常數值被當作一個int值處理所以假若可以使用一個過載的方法就能獲取它使用的int值在其他所有情況下若我們的數據類型小於方法中使用的自變量就會對那種數據類型進行轉型處理char獲得的效果稍有些不同這是由於假期它沒有發現一個准確的char匹配就會轉型為int
  若我們的自變量大於過載方法期望的自變量這時又會出現什麼情況呢?對前述程序的一個修改揭示出了答案
  
  
  //: Demotionjava
  // Demotion of primitives and overloading
  
  public class Demotion {
   static void prt(String s) {
    Systemoutprintln(s);
   }
  
   void f(char x) { prt(f(char)); }
   void f(byte x) { prt(f(byte)); }
   void f(short x) { prt(f(short)); }
   void f(int x) { prt(f(int)); }
   void f(long x) { prt(f(long)); }
   void f(float x) { prt(f(float)); }
   void f(double x) { prt(f(double)); }
  
   void f(char x) { prt(f(char)); }
   void f(byte x) { prt(f(byte)); }
   void f(short x) { prt(f(short)); }
   void f(int x) { prt(f(int)); }
   void f(long x) { prt(f(long)); }
   void f(float x) { prt(f(float)); }
  
   void f(char x) { prt(f(char)); }
   void f(byte x) { prt(f(byte)); }
   void f(short x) { prt(f(short)); }
   void f(int x) { prt(f(int)); }
   void f(long x) { prt(f(long)); }
  
   void f(char x) { prt(f(char)); }
   void f(byte x) { prt(f(byte)); }
   void f(short x) { prt(f(short)); }
   void f(int x) { prt(f(int)); }
  
   void f(char x) { prt(f(char)); }
   void f(byte x) { prt(f(byte)); }
   void f(short x) { prt(f(short)); }
  
   void f(char x) { prt(f(char)); }
   void f(byte x) { prt(f(byte)); }
  
   void f(char x) { prt(f(char)); }
  
   void testDouble() {
    double x = ;
    prt(double argument:);
    f(x);f((float)x);f((long)x);f((int)x);
    f((short)x);f((byte)x);f((char)x);
   }
   public static void main(String[] args) {
    Demotion p = new Demotion();
    ptestDouble();
   }
  } ///:~
  
  在這裡方法采用了容量更小范圍更窄的主類型值若我們的自變量范圍比它寬就必須用括號中的類型名將其轉為適當的類型如果不這樣做編譯器會報告出錯
  大家可注意到這是一種縮小轉換也就是說在造型或轉型過程中可能丟失一些信息這正是編譯器強迫我們明確定義的原因——我們需明確表達想要轉型的願望

From:http://tw.wingwit.com/Article/program/Java/hx/201311/25527.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.