涉及基本类型的重载

来源:互联网 发布:手机秘密录音软件 编辑:程序博客网 时间:2024/06/06 19:37
基本类型能从一个“较小”的类型自动提升至一个“较大”的类型,此过程一旦牵涉到重载,
可能会造成一些混淆。以下例子说明了将基本类型传递给重载方法时发生的情况:


//: c04:PrimitiveOverloading.java
// Promotion of primitives and overloading.
import com.bruceeckel.simpletest.*; 
public class PrimitiveOverloading { 
static Test monitor = new Test(); 
void f1(char x) { System.out.println("f1(char)"); } 
void f1(byte x) { System.out.println("f1(byte)"); } 
void f1(short x) { System.out.println("f1(short)"); }
void f1(int x) { System.out.println("f1(int)"); } 
void f1(long x) { System.out.println("f1(long)"); } 
void f1(float x) { System.out.println("f1(float)"); }
void f1(double x) { System.out.println("f1(double)"); }
void f2(byte x) { System.out.println("f2(byte)"); } 
void f2(short x) { System.out.println("f2(short)"); }
void f2(int x) { System.out.println("f2(int)"); } 
void f2(long x) { System.out.println("f2(long)"); } 
void f2(float x) { System.out.println("f2(float)"); }
void f2(double x) { System.out.println("f2(double)"); }
void f3(short x) { System.out.println("f3(short)"); }
void f3(int x) { System.out.println("f3(int)"); } 
void f3(long x) { System.out.println("f3(long)"); } 
void f3(float x) { System.out.println("f3(float)"); }
void f3(double x) { System.out.println("f3(double)"); }
void f4(int x) { System.out.println("f4(int)"); } 
void f4(long x) { System.out.println("f4(long)"); } 
void f4(float x) { System.out.println("f4(float)"); }
void f4(double x) { System.out.println("f4(double)"); }
void f5(long x) { System.out.println("f5(long)"); } 
void f5(float x) { System.out.println("f5(float)"); }
void f5(double x) { System.out.println("f5(double)"); }
void f6(float x) { System.out.println("f6(float)"); }
void f6(double x) { System.out.println("f6(double)"); }
void f7(double x) { System.out.println("f7(double)"); }
void testConstVal() { 
    System.out.println("Testing with 5");
    f1(5);f2(5);f3(5);f4(5);f5(5);f6(5);f7(5); 
  }
void testChar() { 
char x = 'x'; 
    System.out.println("char argument:");
    f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); 
  }
void testByte() { 
byte x = 0; 
    System.out.println("byte argument:");
 






    f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); 
  }
void testShort() { 
short x = 0; 
    System.out.println("short argument:"); 
    f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); 
  }
void testInt() { 
int x = 0; 
    System.out.println("int argument:"); 
    f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); 
  }
void testLong() { 
long x = 0; 
    System.out.println("long argument:");
    f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); 
  }
void testFloat() { 
float x = 0; 
    System.out.println("float argument:"); 
    f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); 
  }
void testDouble() {
double x = 0; 
    System.out.println("double argument:"); 
    f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); 
  }
public static void main(String[] args) { 
    PrimitiveOverloading p = 
new PrimitiveOverloading();
    p.testConstVal();
    p.testChar();
    p.testByte();
    p.testShort();
    p.testInt();
    p.testLong();
    p.testFloat();
    p.testDouble();
    monitor.expect(new String[] { 
"Testing with 5",
"f1(int)",
"f2(int)",
"f3(int)",
"f4(int)",
 






"f5(long)",
"f6(float)",
"f7(double)",
"char argument:",
"f1(char)",
"f2(int)",
"f3(int)",
"f4(int)",
"f5(long)",
"f6(float)",
"f7(double)",
"byte argument:",
"f1(byte)",
"f2(byte)",
"f3(short)",
"f4(int)",
"f5(long)",
"f6(float)",
"f7(double)",
"short argument:",
"f1(short)",
"f2(short)",
"f3(short)",
"f4(int)",
"f5(long)",
"f6(float)",
"f7(double)",
"int argument:",
"f1(int)",
"f2(int)",
"f3(int)",
"f4(int)",
"f5(long)",
"f6(float)",
"f7(double)",
"long argument:",
"f1(long)",
"f2(long)",
"f3(long)",
"f4(long)",
"f5(long)",
"f6(float)",
"f7(double)",
"float argument:",
 






"f1(float)",
"f2(float)",
"f3(float)",
"f4(float)",
"f5(float)",
"f6(float)",
"f7(double)",
"double argument:",
"f1(double)",
"f2(double)",
"f3(double)",
"f4(double)",
"f5(double)",
"f6(double)",
"f7(double)"
    });
  }
} ///:~


通过程序输出,你会发现常数值 5 被当作 int 值处理。所以如果有某个重载方法接受 int 型
参数,它就会被调用。至于其他情况,如果传入的实际参数类型“小于”方法中声明的形式
参数类型,实际参数的类型就会被“提升”。char 型略有不同,如果无法找到恰好接受 char
参数的方法,就会把 char 直接提升至 int 型。


如果传入的实际参数“大于”重载方法声明的形式参数,会出现什么情况呢?修改上述程序,
就能得到答案:


//: c04:Demotion.java
// Demotion of primitives and overloading.
import com.bruceeckel.simpletest.*; 


public class Demotion { 
static Test monitor = new Test(); 
void f1(char x) { System.out.println("f1(char)"); } 
void f1(byte x) { System.out.println("f1(byte)"); } 
void f1(short x) { System.out.println("f1(short)"); }
void f1(int x) { System.out.println("f1(int)"); } 
void f1(long x) { System.out.println("f1(long)"); } 
void f1(float x) { System.out.println("f1(float)"); }
void f1(double x) { System.out.println("f1(double)"); }


void f2(char x) { System.out.println("f2(char)"); } 
void f2(byte x) { System.out.println("f2(byte)"); } 
void f2(short x) { System.out.println("f2(short)"); }
 






void f2(int x) { System.out.println("f2(int)"); } 
void f2(long x) { System.out.println("f2(long)"); } 
void f2(float x) { System.out.println("f2(float)"); }


void f3(char x) { System.out.println("f3(char)"); } 
void f3(byte x) { System.out.println("f3(byte)"); } 
void f3(short x) { System.out.println("f3(short)"); }
void f3(int x) { System.out.println("f3(int)"); } 
void f3(long x) { System.out.println("f3(long)"); } 


void f4(char x) { System.out.println("f4(char)"); } 
void f4(byte x) { System.out.println("f4(byte)"); } 
void f4(short x) { System.out.println("f4(short)"); }
void f4(int x) { System.out.println("f4(int)"); } 


void f5(char x) { System.out.println("f5(char)"); } 
void f5(byte x) { System.out.println("f5(byte)"); } 
void f5(short x) { System.out.println("f5(short)"); }


void f6(char x) { System.out.println("f6(char)"); } 
void f6(byte x) { System.out.println("f6(byte)"); } 


void f7(char x) { System.out.println("f7(char)"); } 


void testDouble() {
double x = 0; 
    System.out.println("double argument:"); 
    f1(x);f2((float)x);f3((long)x);f4((int)x);
    f5((short)x);f6((byte)x);f7((char)x);
  }
public static void main(String[] args) { 
    Demotion p = new Demotion();
    p.testDouble();
    monitor.expect(new String[] { 
"double argument:",
"f1(double)",
"f2(float)",
"f3(long)",
"f4(int)",
"f5(short)",
"f6(byte)",
"f7(char)"
    });
  }
 
} ///:~


在这里,方法接受“较小”的基本类型作为参数。如果传入的实际参数“较大”,你就得在
圆括号里写上类型名称,做必要的类型转换。如果不这样做,编译器就会报错。


你应该注意到这是一种“窄化转换”,这意味着在类型转换过程中可能会丢失信息。这也正

是编译器强制你必须明确进行类型转换的原因。


原创粉丝点击