[英]Java. Overloading method
例如,我有这个类:
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 param,完美。
2行 - 带字节参数的调用方法... oooops。 做什么? Java尝试将byte扩展为int? 这是真的?
3线呼叫方法与长参数...再次ooops。 做什么? 转换long到int java不行,因为精度损失。 它的尝试? 结果 - 例外。
比我添加这个:
public static void test(Object a)
{
System.out.println("Object");
}
如果是电话:
Col.test((long)100);
所有正确,没有异常所以,原始类型long和Object之间的关系是什么?
是的,有一个从byte
到int
的隐式转换,但没有从long
到int
隐式转换(因为丢失信息的可能性)。
在第三种情况下,你使用的自动装箱 ,这将转换为long
(基本型)到Long
(类类型)。
您可以通过将test
主体更改为:
public static void test(Object a)
{
System.out.println(a.getClass());
}
然后它将打印出class java.lang.Long
。
您的第一个示例显示了基元类型的转换。 第二个显示装箱和拆箱,简而言之 - 原始类型(如long
)和它们的包装类(在本例中为java.lang.Long
)之间的方便转换。
重载是实现具有相同名称但不同参数的方法 。 这里我们有两种方法
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))
是第二种方法的良好匹配。
这是因为自动装箱功能。 实际上你已经将原语提升为long并且在自动调用test方法时它正在为其等效类型进行搜索,因此它调用test(Object a)。你可以看到这样的Col.test(new Integer(12));这也是调用测试(对象a)。也可以参考此链接确定对象是否是基本类型
public static void test(Object obj) {
if (obj instanceof Integer) {
System.out.println("Integer");
} else if (obj instanceof Double) {
System.out.println("Double");
} else if (obj instanceof Float) {
System.out.println("Float");
} else if (obj instanceof Long) {
System.out.println("Long");
}
}
所有java原语都有相应的盒装“类型”,它们是实际的类。 在你的例子中,long有一个对应的类Long。 此类从Object扩展。
你经历的是拳击和拆箱。
它是Java 5中引入的一个功能。它称为Autoboxing。 在这种情况下,基本类型将转换为Object(在您的情况下为long to Long)。 有关Autoboxing的详细信息,请参阅此链接 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.