繼承觀念問題

Home Home
引用 | 編輯 對的人
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()); // 依據面積比較大小
    }
this 這個是呼叫 compare() 這方法本身的物件
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;
                }
            }
        }
    }
if(objs[j].compare(objs[j+1])<0)
注意看~經過這行呼叫的 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
引用 | 編輯 對的人
2009-04-11 22:34
10樓
  
哦,那我了解了,非常感謝大大耐心的回應^^。

獻花 x0