11. public class Yikes {
12.
13. public static void go(Long n) {System.out.println(”Long “);}
14. public static void go(Short n) {System.out.println(”Short “);}
15. public static void go(int n) {System.out.println(”int “);}
16. public static void main(String [] args) {
17. short y= 6;
18. long z= 7;
19. go(y);
20. go(z);
21. }
22. }输出为int Long为什么不是Short Long???

解决方案 »

  1.   

    y作为值传过去会自动提示为int型!
      

  2.   

    是不因为java内部进行了优化呢,就是说,如果用int都可表示的情况,对此又少占了内存啦,就不用long呢,因为int 上一级才是long 呢,这样理解会不会好一点呢,
      

  3.   

    因为对于short y= 6; 
    这里的6为int型,所以赋值后你的y也是int型了,这是隐式类型转换
    而long z=7;
    这里的7依然为int型,但是你的z的类型long不会被转化为int型,z依然为long型
      

  4.   

    顶三楼,这是数据类型的自动转换,
    建议楼主看下java数据类型
    如果不想转换,可以写成short y = 6S;
      

  5.   

    顶三楼的  如果楼主还是不太清楚可以去看看java编程规范。
      

  6.   

    楼主用的是"Long","Short",这是Java的封装类,而不是基本类型,如果楼主改成基本类型"long","short",就可以看到期望的结果了.
      

  7.   

    我觉得是你把y做为值传,而不是对象
    在你的方法里就选择用值的那个,也是因为short与int兼容
      

  8.   

    原因是这样的:
       电脑是很懒的,你给他一个参数,他发现是可以自动转换的,就转成int了
    但是如果级别比int高 如这里的long ,不能转换了,所以这时候它才用其他复杂的方法,
    如这里用的是 自动封箱解箱当然 如果你的类型他直接可以找到的话,他就会什么都不做,直接传。
    就是10楼的那种情况了
      

  9.   

    楼主你发现没?
    13. public static void go(Long n) {System.out.println(”Long “);} 
    14. public static void go(Short n) {System.out.println(”Short “);} 
    13,14行入参类型"Long"和"Short"你大写了,大写和小写就区别可大了,大写就成了类,那么这里的n就是对象的引用了。
    数据类型分为:1--primivte和2---reference,你在main()方法里定义的y,z都是primivte,又因为primitive中的【整型值】byte-short-int-long四种中的缺省值是int型,又因为short变int是显示转换,所以你go(y)时go()方法会先找入参类型与实参类型匹配的,就是都是primitive的,就找到15:public static void go(int n) {System.out.println(”int “);}所以出int.
    而long型值就不能显示转换为int了,所以go(z)时,他找不到可以匹配的primivte类型,就找到自己的封装类Long,因为Long 类在对象中包装了基本类型 long 的值。(估计这里面有个优先级的关系)
    楼主可以实验下:①把15行屏蔽就出Short Long  ②或者把15行里int改成类Integer,还是出Short Long  ③或者把14行里Short改成short还是出Short Long.
    另外5楼的是错误的,【整型值】只有long型值才可以在数字后面加"l"(不是1);
      

  10.   

    顶 1楼的 
           java计算都是最小就是int型  不是int型比他小的都转换为int 
      

  11.   


    数据类型中自动提升哈byte-short-int-long