继承观念问题

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