当前位置:编程学习 > JAVA >>

包装类和方法重载的一些疑惑????

public class Close {
public static void go(Long n ){System.out.println("long1121");}
public static void go(Short n ){System.out.println("short");}
public static void go (int n ){System.out.println("int");}

        public static void main(String[] args){
        short y =6;
long z =7;
go(y); 
go(z);
}


}






几点疑问:1)这里的y由于未找到相应的方法,因而其向更大范围的int转换???是否是这么理解的?
         2)按照1)中的理解,这里的z无法调到符合类型的go方法,但结果却是输出long1121?
不是很明白,难道是仍然可以调到其包装类?还望大神帮小弟解答一下,谢谢各位大大了!!!!!

--------------------编程问答-------------------- 现在的jdk会自动装箱拆箱

匹配方法时不会遍历所有方法去找最接近的,而是找到能用的就调用了。

你可以把那个short的方法的申明方第一个看看 --------------------编程问答-------------------- 第一点理解的对
方法重载时首先编译器会列出所有调用的候选方法,然后进行重载解析,直到找到与实参匹配的方法,也就是这里的String类型参数的方法,当找不到该种实参类型的方法时会将其向上转型。

package csdn_test_bbs;
public class test {

public static void go(Long n) {
System.out.println("long"); }

public static void go(Short n) {
System.out.println("short");
}
public static void go(float n) {
System.out.println("float"); }
//public static void go(int n) {
//System.out.println("int"); }


public static void main(String[] args)
{
short y =6;
long z=7;
go(y);
go(z);

}
}
执行后output:float float

第二点,long无法向int自动转型的,只会向更高级的float,double。

假若注释掉go(Long n)方法,编译器会对go(z)报错,此时找不到与之匹配的方法。

另外,基本类型在堆栈中创建;而对于对象类型,对象在堆中创建,对象的引用在堆栈中创建。short y创建y变量后,编译器会优先在堆栈中匹配。(Short属于封装类,而short是基本数据类型) --------------------编程问答-------------------- 2楼string改为int


sorry about this --------------------编程问答-------------------- 在调用方法时,首先寻找参数类型相匹配的方法,如果没有则将实参自动向上转型,看是否有匹配的参数类型 --------------------编程问答-------------------- 在比int小的数据类型会自动转换成int类型,仅此而已 --------------------编程问答--------------------
引用 2 楼 linyixuan1989 的回复:
第一点理解的对
方法重载时首先编译器会列出所有调用的候选方法,然后进行重载解析,直到找到与实参匹配的方法,也就是这里的String类型参数的方法,当找不到该种实参类型的方法时会将其向上转型。

package csdn_test_bbs;
public class test {

public static void go(Long n) {
System.out.println("long"); }

public static void go(Short n) {
System.out.println("short");
}
public static void go(float n) {
System.out.println("float"); }
//public static void go(int n) {
//System.out.println("int"); }


public static void main(String[] args)
{
short y =6;
long z=7;
go(y);
go(z);

}
}
执行后output:float float

第二点,long无法向int自动转型的,只会向更高级的float,double。

假若注释掉go(Long n)方法,编译器会对go(z)报错,此时找不到与之匹配的方法。

另外,基本类型在堆栈中创建;而对于对象类型,对象在堆中创建,对象的引用在堆栈中创建。short y创建y变量后,编译器会优先在堆栈中匹配。(Short属于封装类,而short是基本数据类型)



是不是这么理解:
1)当传入类型的数据未找到相应类型方法时,其会自动向上转型.
2)当基本类型数据未找到相应类型数据时,其会自动的装包成相应的封装类,进而去调用该封装类? --------------------编程问答-------------------- 这里涉及到一般conversion of object reference Types

其实按你理解的就行,实际上是内存中的细节
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,