引用 | 編輯
對的人
2009-04-07 00:13 |
樓主
▼ |
||
x0
各位大大好,我是超級新手,有幾個觀念性的問題想請教,以下是Code:Code太長,改用臨時網頁代替:http://myhome.kbronet.com.tw/a1986751106/ 我的問題是...如果把這段刪除的話,結果還 .. 訪客只能看到部份內容,免費 加入會員 x0
|
引用 | 編輯
overing
2009-04-09 08:37 |
1樓
▲ ▼ |
把目錄下的 .class 檔都殺乾淨再編譯看看
之所以你第二次刪除這段還能編譯成功 我想是因為前一次編譯已經有產生 Land.class 第二次編譯雖然你刪掉Land的定義 不過編譯器會嘗試尋找workpath還有classpath底下 有沒有 Land.java(或有定義Land的其他 .java) 或是 Land.class 有找到而且繼承架構正確還是會讓你編譯成功 另外...code麻煩記得縮排一下 多按幾個空白或是TAB鍵會讓你的程式看起來好讀很多 x1 |
引用 | 編輯
對的人
2009-04-09 23:09 |
2樓
▲ ▼ |
感謝大大回應,我知道了^^。
不過還有個問題: return (int)( this.price()-l.price()) 請問這段 的 this.price 的值為多少? 這樣問好像不對,他所指的this.price()是從哪 抓的? x0 |
引用 | 編輯
overing
2009-04-11 05:10 |
3樓
▲ ▼ |
this 同常指的是 類別定義 所生成的物件本身
相對的詞是super 指的是父類別 生成的物件 通常用在子類有複寫父類的成員時 要指明用哪邊的成員 舉個例子可能不是很貼切 看看就好 複製程式 class Father { void printMe() { System.out.println("Father"); } } public class Son extends Father { void printMe() { System.out.println("Son"); } void printMyFather() { super.printMe(); } public static void main(String[] argv) { Son s = new Son(); s.printMe(); s.printMyFather(); } } x1 |
引用 | 編輯
對的人
2009-04-11 20:59 |
4樓
▲ ▼ |
大大我是懂this 的用法, 但我的問題..還是搞不懂..
return (int)( this.price()-l.price()) 我應該要問,this.price()抓取的第一次的值為多少? x0 |
引用 | 編輯
overing
2009-04-11 21:17 |
5樓
▲ ▼ |
你確定 this 的意思真的有弄懂嗎?
這 this 是位在 abstract class Land 下 所以真正 this 的時候是會去指到繼承 Land 的類別所生產出來的物件本身 而他呼叫的 price() 方法在 Land的定義中也是抽象的 所以真正在呼叫的時候 會呼叫的是"實作"了這方法的子類別 複製程式 Land l1 = new Circle(5,1000); Land l2 = new Square(3,2000); l1.price(); //這呼叫的是 Circle 的 l2.price(); //這呼叫的就是 Square 的了 抽象的東西是沒有實體的 全看你真正去生成時 是什麼物件(物件才有實體) 來決定這抽象的東西是什麼 x1 |
引用 | 編輯
對的人
2009-04-11 21:26 |
6樓
▲ ▼ |
這 this 是位在 abstract class Land 下
所以真正 this 的時候是會去指到繼承 Land 的類別所生產出來的物件本身 那請問大大...l.price() 方法 不就等於 this.price() ?? 這樣兩個互減要怎排序?? x0 |
引用 | 編輯
overing
2009-04-11 21:41 |
7樓
▲ ▼ |
這兩個並不是"同一個"物件呦~
複製程式 public int compare(ICanCompare i) { // 實作compare Land l = (Land) i; return (int)(this.price() - l.price()); // 依據面積比較大小 } l 這個是透過參數 i 傳近來之後 當成(Land) 的物件 往回看看呼叫 compare() 的地方 複製程式 static void bSort(ICanCompare[] objs){ for(int i=objs.length-1;i>0;i--){ for(int j=0;j<i;j++){ if(objs[j].compare(objs[j+1])<0){ ICanCompare temp=objs[j]; objs[j]=objs[j+1]; objs[j+1]=temp; } } } } 注意看~經過這行呼叫的 compare() 到return的時候 是會變成 objs[j].price() - objs[j+1].price() 的呦~ x1 |
引用 | 編輯
對的人
2009-04-11 22:09 |
8樓
▲ ▼ |
那請問...
if(objs[j].compare(objs[j+1])<0) compare方法裡面傳的是什麼參數?? 如果他是寫這樣 我還可以理解: if(objs[j].compare(objs[j+1])) 如果照原本方法,要傳什麼東西? x0 |
引用 | 編輯
overing
2009-04-11 22:29 |
9樓
▲ ▼ |
if(objs[j].compare(objs[j+1]))
的話就沒意義了 編譯器也不會給過的 if()條件裡面敘述句最後的運算結果必須是 boolean 可是 compare() 方法的傳回值是 public int compare(ICanCompare i) {} 是 int 而這個int代表的是兩物件之間的面積差 所以回到 if(objs[j].compare(objs[j+1])<0)來看 這句翻成白話文 "如果 objs[j] 面積減 objs[j+1]面積 小於0就..." 那段的程式碼就是一個個去互相比較 如果陣列中 第 j 位置的形狀面積減去 第 j+1位置的形狀面積小於0 表示 j那位置的形狀面積 比 j+1位置的形狀面積小 於是就將兩個交換位置 因為排序後的陣列要"面積大的在上面" 複製程式 //這是典型的氣泡式排序法 static void bSort(ICanCompare[] objs){ //排序用的副程式 參數接受一個 ICanCompare陣列 for(int i=objs.length-1;i>0;i--){ //迴圈, i由陣列最底端開始, >0就繼續執行, 每圈完 i-1 for(int j=0;j<i;j++){ //迴圈, j從0開始, <i就繼續執行, 每圈完 j-1 if(objs[j].compare(objs[j+1])<0){ //如果 陣列中第j位置的形狀面積-第j+1位置的形狀面積<0 (表示j+1那個形狀比較大) ICanCompare temp=objs[j]; //開個暫存空間放 陣列位置j的形狀 objs[j]=objs[j+1]; //將陣列j+1位置的形狀放到陣列j位置 objs[j+1]=temp;//將暫存的形狀放到陣列位置j+1 } } } } x1 |