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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗海云 中级黑马   /  2013-2-27 15:38  /  1365 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗海云 于 2013-2-27 20:14 编辑

package com.itheima.p1.text;

class Text{
public static void main(String[] args){
  someMethod(1);
}
public static void someMethod(int i){
  System.out.println("int 版本被调用");
}
public static void someMethod(Integer i){
  System.out.println("Integer 版本被调用");
}
}
输出结果为:
int版本被调用,.
自动装箱动作为什么没发生呢?
有人能解释下为什么吗?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 夏振博 于 2013-2-27 16:10 编辑

当只有Integer参数方法是编译器会做如下操作:(反编译器文件)
  1. import java.io.PrintStream;

  2. class Test
  3. {

  4.     Test()
  5.     {
  6.     }

  7.     public static void main(String args[])
  8.     {
  9.         someMethod(Integer.valueOf(1));
  10.     }

  11.     public static void someMethod(Integer i)
  12.     {
  13.         System.out.println("Integer \u7248\u672C\u88AB\u8C03\u7528");
  14.     }
复制代码
说明这种传参也可以自动包装。
当有Integer和int两种参数方法时编译器做如下操作:(反编译器文件)
  1. import java.io.PrintStream;

  2. class Test
  3. {

  4.     Test()
  5.     {
  6.     }

  7.     public static void main(String args[])
  8.     {
  9.         someMethod(1);
  10.     }

  11.     public static void someMethod(Integer i)
  12.     {
  13.         System.out.println("Integer \u7248\u672C\u88AB\u8C03\u7528");
  14.     }

  15.     public static void someMethod(int i)
  16.     {
  17.         System.out.println("int \u7248\u672C\u88AB\u8C03\u7528");
  18.     }
  19. }
复制代码
结果他没有自动包装,说明当有匹配的整数基本类型时编译器不会自动包装,注:当有long等整数基本类型时也不会自动装箱,会对参数进行加宽处理,转换成long类型
回复 使用道具 举报
Java虚拟机直接根据我们运行的实际环境给我们将数据类型进行转换(这里的转换是指在类和基本数据类型之间的转换)。明显这里你传的实参(int型)有匹配的,它就不会自动包装,当你去掉public static void someMethod(int i);它就会帮你自动装箱,从而调用public static void someMethod(Integer i);

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马