A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

aa

© 周学彬 中级黑马   /  2013-10-24 22:16  /  1463 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 周学彬 于 2016-12-19 20:08 编辑
  1. 哎哎哎哎哎哎哎哎哎 哎哎哎
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

7 个回复

倒序浏览
验证了下,当把参数为int的输出语句注销,才会打印short,原理不明,等解答.
回复 使用道具 举报
也是请教了别人,给你也回答下吧。应该是虚拟机认为类型提升比包装类更简单。
short a = 3;
print(a);
public static void print(Short n)
{
     System.out.println("包装类");
}
public static void println(int n)
{
      System.out.println("类型提升");
}
回复 使用道具 举报
本帖最后由 我能学编程吗 于 2013-10-24 23:52 编辑
寻丶丶觅 发表于 2013-10-24 22:28
验证了下,当把参数为int的输出语句注销,才会打印short,原理不明,等解答. ...

我试验了一下,没有你说的问题存在。

关于楼主的问题,我个人认为:
1、变量x、y、z 都是基本数据类型,所以找方法时先找参数是基本类型的方法,在你的程序中,参数是基本数据类型的方法即为:print(int n)方法一个。
2、传int x 时,成功找到输出 int
3、传short y 时,没找到接收基本类型为short的方法,但是print(int n)方法中,int容量比short大,所以short可以转换成int而不丢失精度,所以调用了print(int n)方法,系统自动把y转换成int传了进去
4、传long z 时,没找到接收基本类型为long的方法,有基本类型为int的方法,但是long转为int的话会丢失精度,所以不能调用print(int n)方法。接着找到了print(Long n)方法,系统会把long自动装包,long就变成了Long对象,所以调用了print(Long n)方法

总结就是:传的参数为基本类型的,先找对应基本类型的如byte对byte是对应的,如果没有则看有没有能强转的如byte能强转为int而不丢精度,再没有则看有没有对应包装类的,如byte对应Byte

你那问题的解决办法,把参数类型都改成基本类型就行了。  或者都改成包装类型。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
jvm自动类型提升了
回复 使用道具 举报
这里体现了简单数据类型之间的转换
   在Java中整型、实型、字符型被视为简单数据类型,这些类型由低级到高级分别为
[center](byte,short,char)--int--long--float--double[/center]
    简单数据类型之间的转换又可以分为:
   ●低级到高级的自动类型转换
   ●高级到低级的强制类型转换
   ●包装类过渡类型能够转换
自动类型转换
   低级变量可以直接转换为高级变量,笔者称之为自动类型转换,例如,下面的语句可以在Java中直接通过:

byte b;int i=b;long l=b;float f=b;double d=b;

希望对您有帮助!

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
Java数据类型的表示范围由小到大的顺序依次为:小→大 byte→short→char→int→long→float→double
jvm在默认情况下都会把整数转化为int类型,当值范围小于int值范围的整数类型数据使用字面值赋值的时候,默认值为int类型,就是直接使用0或者其他数字的时候,值的类型为int类型,short值范围小于int值范围,所以当使用short a = 0这种赋值方式的时候,JVM内部存在数据转换,输出了两次int

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
hurryup 高级黑马 2013-10-25 13:43:52
8#
变量x、y、z 都是基本数据类型,所以找方法时先找参数是基本类型的方法,在你的程序中,参数是基本数据类型的方法即为:print(int n)方法一个。

既然x,y,z都是基本数据类型,那它们对应的方法岂不都是基本类型方法,为什么说只有print(int n)呢,print(short n),print(long n)就不是基本数据类型了?这不自相矛盾吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马