引用 | 编辑
对的人
2009-04-07 00:13 |
楼主
▼ |
||
![]() Code太长,改用临时网页代替:http://myhome.kbronet.com.tw/a1986751106/ 我的问题是...如果把这段删除的话,结果还 .. 访客只能看到部份内容,免费 加入会员 ![]()
|
引用 | 编辑
overing
2009-04-09 08:37 |
1楼
▲ ▼ |
把目录下的 .class 档都杀干净再编译看看
之所以你第二次删除这段还能编译成功 我想是因为前一次编译已经有产生 Land.class 第二次编译虽然你删掉Land的定义 不过编译器会尝试寻找workpath还有classpath底下 有没有 Land.java(或有定义Land的其他 .java) 或是 Land.class 有找到而且继承架构正确还是会让你编译成功 另外...code麻烦记得缩排一下 ![]() 多按几个空白或是TAB键会让你的程式看起来好读很多 ![]() |
引用 | 编辑
对的人
2009-04-09 23:09 |
2楼
▲ ▼ |
感谢大大回应,我知道了^^。
不过还有个问题: return (int)( this.price()-l.price()) 请问这段 的 this.price 的值为多少? 这样问好像不对,他所指的this.price()是从哪 抓的? ![]() |
引用 | 编辑
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(); } } ![]() |
引用 | 编辑
对的人
2009-04-11 20:59 |
4楼
▲ ▼ |
大大我是懂this 的用法, 但我的问题..还是搞不懂..
return (int)( this.price()-l.price()) 我应该要问,this.price()抓取的第一次的值为多少? ![]() |
引用 | 编辑
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 的了 抽象的东西是没有实体的 全看你真正去生成时 是什么物件(物件才有实体) 来决定这抽象的东西是什么 ![]() |
引用 | 编辑
对的人
2009-04-11 21:26 |
6楼
▲ ▼ |
这 this 是位在 abstract class Land 下
所以真正 this 的时候是会去指到继承 Land 的类别所生产出来的物件本身 那请问大大...l.price() 方法 不就等于 this.price() ?? 这样两个互减要怎排序?? ![]() |
引用 | 编辑
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() 的呦~ ![]() ![]() |
引用 | 编辑
对的人
2009-04-11 22:09 |
8楼
▲ ▼ |
那请问...
if(objs[j].compare(objs[j+1])<0) compare方法里面传的是什么参数?? 如果他是写这样 我还可以理解: if(objs[j].compare(objs[j+1])) 如果照原本方法,要传什么东西? ![]() |
引用 | 编辑
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 } } } } ![]() |