黑马程序员技术交流社区

标题: aa [打印本页]

作者: 周学彬    时间: 2013-10-24 22:16
标题: aa
本帖最后由 周学彬 于 2016-12-19 20:08 编辑
  1. 哎哎哎哎哎哎哎哎哎 哎哎哎
复制代码

作者: 寻丶丶觅    时间: 2013-10-24 22:28
验证了下,当把参数为int的输出语句注销,才会打印short,原理不明,等解答.
作者: 寻丶丶觅    时间: 2013-10-24 23:43
也是请教了别人,给你也回答下吧。应该是虚拟机认为类型提升比包装类更简单。
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:47
本帖最后由 我能学编程吗 于 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

你那问题的解决办法,把参数类型都改成基本类型就行了。  或者都改成包装类型。
作者: 卑微の小幸福    时间: 2013-10-25 00:51
jvm自动类型提升了
作者: 1961993790    时间: 2013-10-25 08:44
这里体现了简单数据类型之间的转换
   在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;

希望对您有帮助!
作者: Yuan先生    时间: 2013-10-25 09:38
Java数据类型的表示范围由小到大的顺序依次为:小→大 byte→short→char→int→long→float→double
jvm在默认情况下都会把整数转化为int类型,当值范围小于int值范围的整数类型数据使用字面值赋值的时候,默认值为int类型,就是直接使用0或者其他数字的时候,值的类型为int类型,short值范围小于int值范围,所以当使用short a = 0这种赋值方式的时候,JVM内部存在数据转换,输出了两次int
作者: hurryup    时间: 2013-10-25 13:43
变量x、y、z 都是基本数据类型,所以找方法时先找参数是基本类型的方法,在你的程序中,参数是基本数据类型的方法即为:print(int n)方法一个。

既然x,y,z都是基本数据类型,那它们对应的方法岂不都是基本类型方法,为什么说只有print(int n)呢,print(short n),print(long n)就不是基本数据类型了?这不自相矛盾吗?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2