public class PrimitiveOverloading {
public static void f(short x) {
System.out.println("f(short)");
}

public static void f(int x) {
System.out.println("f(int)");
}

public static void f(long x) {
System.out.println("f(long)");
}

public static void f(float x) {
System.out.println("f(float)");
}
public static void main(String[] args) {
byte b = 4;
f(b);
}
}
结果怎么是f(short)啊?为什么不是f(int)呢?不理解啊

解决方案 »

  1.   

    这个 似乎 是 就近 原则, byte 比较 接近 short 而不是int如果有这个  public static void f(byte x) {
            System.out.println("f(float)");
        }
    他会去匹配这个。。当然 这里没有了。呵呵
      

  2.   

    f(b),既然你能把这个参数放到这个方法里面,说明他就已经把b,匹配给了某一个类型了!
      

  3.   

      问题的关键点:byte b = 4;  来自《java2学习指南》,
      先看一下下面的语句那些是非法的。   
        
      byte   b1=2;   
      byte   b2=1+1;   
      byte   b3=b1+1;   
      byte   b4=b1++;   
        
      int   i1=Integer.MAX_VALUE+1;   //Integer.MAX_VALUE=2147483647   
      int   i2=2147483648;   
        
        
      把byte改为char和short几乎是一样的。   
      因为整数字面常量是int型的,也就是1和2都是int型的   
      在赋值语句中直接把一个int型赋给byte肯定是不行的。   
      int   i=1;   
      byte   b=i;   
      是编译不过的,因为隐性类型转换不允许,改为下面的就可以了   
      int   i=1;   
      byte   b=(byte)i;   
        
      隐性转换一般都是放宽转换(如byte到int,String到Object)   
      但是却有一个例外就是,在赋值转换中,   
      隐性转换也包含了缩窄基本转换。   
        
      就是从int到byte,char,short的转换:   
      比如:   
      byte   b=1;//合法   
      byte   b=128;   //非法   
        
      右边必须为int型字面常量,而且值必须能被左边类型表示。
      从低到高:byte->char->short->int
      
         
     
      

  4.   

    呵呵,这个有点意思,结论确实是short
      

  5.   

    确实显示: f(short)
    byte:一个字节(8位)   
    short:两个字节(16位) 
    int:四个字节(32位)(一个字长) 
    long:八个字节(64位)
    float:四个字节(32位)
    double:八个字节(64位) 
    看看这个 
      

  6.   

    更有意思的是char类型,如果是传一个char类型的参数,大家猜猜看结果会是什么,是不是f(int)
      

  7.   

    public static void main(String[] args) {
    System.out.println(Byte.MAX_VALUE);
    System.out.println(Character.MAX_VALUE);
    System.out.println(Short.MAX_VALUE);
    System.out.println(Integer.MAX_VALUE);
    System.out.println(Long.MAX_VALUE);
    }
    127
    ?
    32767
    2147483647
    9223372036854775807
      

  8.   

    我在书上看到,说int short char 之间是不能传换的,都是要转成int类型啊不理解啊