詢問關於傳入型態的問題 |
尚未結案
|
warke
一般會員 發表:19 回覆:32 積分:10 註冊:2004-09-04 發送簡訊給我 |
底下兩段程式裡面阿,小弟有點疑問。
public class t { static String m(float i) {return "float";} static String m(double i) {return "double";} public static void main (String[] arg) { char a1 = 1; long b1 = 2; System.out.print(m(a1) "," m(b1)); } } 執行結果 E:\web\JavaTest>javac t.java E:\web\JavaTest>java t float,float public class t { static String m(int i) {return "int";} static String m(float i) {return "float";} public static void main (String[] arg) { long a1 = 1; double b1 = 2; System.out.print(m(a1) "," m(b1)); } } 執行結果 E:\web\JavaTest>javac t.java t.java:8: cannot find symbol symbol : method m(double) location: class t System.out.print(m(a1) "," m(b1)); ^ 1 error就是說,假設當副程式在傳的時候是用float在傳,那就可以解釋說為什麼第二個程式在編譯的時候會出現錯誤。 不過那第一個程式裡面的 static String m(double i) {return "double";} 不就不可能執行到了嗎? 又如果不是的話,那副程式的傳值,到底是傳什麼東西啊?如果是用double在傳,那麼,第二段程式應該就不會是錯誤才對阿。 請問一下各位大大。 這個到底該怎麼解釋呢? |
紫玫瑰
一般會員 發表:1 回覆:2 積分:0 註冊:2004-12-01 發送簡訊給我 |
我印中是這樣的~~
java在傳值的型態時,若沒有完全相符的型態~~~
其會自動將其判斷至相似的型態之中~~
你的第一個程式中~~char和long都被判斷成float型態~~~ 第二個程式裡面double的型態會出錯我記得是因為~~
double的型態雖然在我們看來應該會跟float相近會判斷成float~~
但是在java中無法將double判斷成float~~而double也無法判斷成int的型態~~
所以出現錯誤訊息~~ 在我的印象中是這個樣子~~
如果有錯誤希望各位大大指正~~
|
warke
一般會員 發表:19 回覆:32 積分:10 註冊:2004-09-04 發送簡訊給我 |
底下是小弟的測試結果: public class t
{
static String m(int i) {return "int";}
static String m(float i) {return "float";}
static String m(double i) {return "double";}
public static void main (String[] arg)
{
char a1 = 1; long b1 = 1; double c1 = 1;
System.out.print(m(a1) "," m(b1) "," m(c1));
}
}
[print]
% javac t.java % java t
int,float,double
%
[/print] public class t
{
// static String m(int i) {return "int";}
static String m(float i) {return "float";}
static String m(double i) {return "double";}
public static void main (String[] arg)
{
char a1 = 1; long b1 = 1; double c1 = 1;
System.out.print(m(a1) "," m(b1) "," m(c1));
}
}
[print]
% javac t.java % java t
float,float,double
%
[/print] public class t
{
// static String m(int i) {return "int";}
// static String m(float i) {return "float";}
static String m(double i) {return "double";}
public static void main (String[] arg)
{
char a1 = 1; long b1 = 1; double c1 = 1;
System.out.print(m(a1) "," m(b1) "," m(c1));
}
}
[print]
% javac t.java % java t
double,double,double
%
[/print] public class t
{
static String m(int i) {return "int";}
// static String m(float i) {return "float";}
static String m(double i) {return "double";}
public static void main (String[] arg)
{
char a1 = 1; long b1 = 1; double c1 = 1;
System.out.print(m(a1) "," m(b1) "," m(c1));
}
}
[print]
% javac t.java % java t
int,double,double
%
[/print] 正如紫玫瑰大大所言,他會找最接近而且可以完整容納的容器來回應。
感謝你的講解喔^^~ 發表人 - warke 於 2004/12/02 08:16:05
|
Komuro
一般會員 發表:27 回覆:46 積分:14 註冊:2004-02-19 發送簡訊給我 |
System.out.print(m(a1) "," m(b1));中呼叫m()時 是依照a1及b1的型態來判斷
要call那一個m(),此為overloading的概念,因為Java規定呼叫的m()的引數型態
要>=引數a1,b1的型態,也就是你的參數其型態必須不小於且最接近要call的方法的引數型態,
所以第一支程式中char a1 = 1; long b1 = 2;會call static String m(float i){}
但第二支程式中long a1 = 1; double b1 = 2; a1會call static String m(float i){}沒問題,但b1是double大於int 及 float違反之前講的規則,會造成compile錯誤
你可以將System.out.print(m(a1) "," m(b1));改成
System.out.print(m(a1) "," m((float)b1));或是
System.out.print(m(a1) "," m((int)b1));
就可以通過 發表人 - Komuro 於 2004/12/15 16:24:12
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |