首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java语言。重载方法

Java语言。重载方法
EN

Stack Overflow用户
提问于 2010-12-08 15:29:53
回答 6查看 1K关注 0票数 5

例如,我有这样一个类:

代码语言:javascript
复制
public class Col {

static void test(int a)
    {
        System.out.println("int");
    }
    public static void main(String args[])
    {
        Col.test(12);  //1

        Col.test((byte)12); //2

        Col.test((long)100); //3

    }
}

现在我来看看algoritm是如何运行这段代码的。我认为,这一步:

1行-所有正确的调用方法与int参数,完美。

2带有字节param...oooops的线路调用方法。做什么?Java尝试将字节加宽为int?是真的吗?

带有长参数的3行调用方法...又来了。做什么?不能将long转换为int java,因为会损失准确性。试试看?和在结果异常中。

然后我再加一句:

代码语言:javascript
复制
 public static void test(Object a)
    {
        System.out.println("Object");
    }

如果有一个电话:

代码语言:javascript
复制
Col.test((long)100);

都是正确的,没有例外,那么,原语类型long和Object之间的关系是什么?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-12-08 15:32:31

是的,存在从byteint的隐式转换,但没有从longint的隐式转换(因为可能会丢失信息)。

在第三种情况下,您使用的是自动装箱,它会将long (原语类型)转换为Long (类类型)。

您可以通过将test的主体更改为:

代码语言:javascript
复制
public static void test(Object a)
{
    System.out.println(a.getClass());
}

然后它将打印出class java.lang.Long

票数 7
EN

Stack Overflow用户

发布于 2010-12-08 15:39:49

您的第一个示例显示了原始类型的转换。第二个示例显示了装箱和拆箱,简而言之,这是原始类型(如long)和它们的包装类(本例中为java.lang.Long)之间的方便转换。

重载是实现名称相同但参数不同的方法。这里我们有两个方法

代码语言:javascript
复制
static void test(int a){}
static void test(Object a){}

并使用test((long) 100)调用它。第一个方法不能被调用,因为如果没有显式类型转换,JVM不会将long限制为int。但是JVM (版本1.5+)可以将long值转换为Long (自动装箱),而test(Long.valueOf((long) 100))是第二种方法的最佳匹配。

票数 4
EN

Stack Overflow用户

发布于 2010-12-08 15:47:26

这是因为自动装箱功能。实际上,您已经将原语提升为long,并且在自动调用测试方法时,它正在搜索其等效类型,因此它调用的是test(Object A),.You可以看到类似这样的Col.test(new Integer(12));这也将调用test(Object a).Also您可以引用此链接Determining if an Object is of primitive type

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4385136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档