全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1318
推到 Plurk!
推到 Facebook!

詢問關於傳入型態的問題

尚未結案
warke
一般會員


發表:19
回覆:32
積分:10
註冊:2004-09-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-29 23:14:08 IP:211.76.xxx.xxx 未訂閱
底下兩段程式裡面阿,小弟有點疑問。
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-02 00:05:32 IP:218.175.xxx.xxx 未訂閱
我印中是這樣的~~ java在傳值的型態時,若沒有完全相符的型態~~~ 其會自動將其判斷至相似的型態之中~~ 你的第一個程式中~~char和long都被判斷成float型態~~~ 第二個程式裡面double的型態會出錯我記得是因為~~ double的型態雖然在我們看來應該會跟float相近會判斷成float~~ 但是在java中無法將double判斷成float~~而double也無法判斷成int的型態~~ 所以出現錯誤訊息~~ 在我的印象中是這個樣子~~ 如果有錯誤希望各位大大指正~~
warke
一般會員


發表:19
回覆:32
積分:10
註冊:2004-09-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-02 08:13:51 IP:218.170.xxx.xxx 未訂閱
底下是小弟的測試結果: 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-15 16:19:36 IP:210.241.xxx.xxx 未訂閱
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
系統時間:2024-05-08 12:19:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!