b98902HW 板


LINE

经过一番折腾我终於发现上课时连super都还没教到,看来得整个从头讲起了...... (不想看我的废文的话请自行翻阅课本Ch.7) 还记得 this 吗?一个「指向自身」的reference,例如: class Piano{ public int price; public Piano(int price){ this.price = price; } public void play(String sound){ System.out.println(sound); } public void play(){ this.play("zzz"); } } 可以藉其取用同层 Class 的 fields 及 methods 。 而 super 指向的是「自身 class 所继承的 class 」,即 superclass 。 但它还是不能存取 superclass 内以 private 宣告的成员。 那它到底有什麽用处呢? 当 superclass 的成员被继承下来後,subclass 内可能用一个一模一样的东西, 将其覆写(override)(用於methods)/隐藏(hidden)(用於fields),而有了新的定义, (如这次作业的 showShort() 及 showAll() ) 但是当我真的非常需要使用上层的东西时呢?就是使用super的时机了。 例如: /** * A conscienceless seller want to disguise a piano as an electric piano. */ class ElectricPiano extends Piano{ public int price; //隐藏了上层的price public ElectricPiano(int price){ super(price); this.price = super.price * 10. } public void play(String sound){ //覆写了上层的play(String sound) System.out.print("This is the sound played by eletric piano:"); super(sound); } } 新类别的 constructor 中,呼叫了 super(int) ,也就是 superclass 的建构式。 此时在一个 ElectricPiano 的 instance 中,两个 price 是并存的, 但外界只看得到 subclass 的变数,只有黑心商人能透过 super 取得旧价格, 并将新价格定为它的十倍。 play(String) 被覆写为新的电钢琴版本,一样透过 super 呼叫旧有的 method 。 而 play(无参数) 则未被覆写,如果客人用到这个函数,黑心商人的诡计就被拆穿啦。 要注意的是, super 不能在 static 函式中使用, 原因就和 static 函式(跟着class)不能取用其他 non-static 成员(跟着object)一样。 --- 回到原本问题,我明明已经继承了POOArticle,想来测试一下,为什麽一直拿到hahaha? package ntu.csie.oop10spring; public class POOAdvArticle extends POOArticle{ public static void main(String[] args){ System.out.println("testXD."); } } 表面上看起来没什麽问题,我什麽事都没做,为什麽它会说找不到POOArticle() Q_Q。 java 在建构一个 object时,执行的顺序是这样的: 1. 呼叫 superclass 的建构式,将继承而来的部分建构完成。 2. 将需要初始化的变数初始化。 3. 执行建构式的主体。 很久以前上课有提到,如果没有定义 constructor ,javac会自动塞一个「空的」进去, 如果有,就使用自行定义的而不会产生空的。 也就是说,如果什麽建构式都没写,可以想像成会自动塞进一个像这样的东西: public POOAdvArticle(){ super(); } 发现问题所在了吗? 正因为什麽事都没做,javac编译时便预设为呼叫无参数的 super(), 但是无参数的 POOArticle() 根本不存在,javac 就这样自作自受然後对你hahaha。 正规的写法是在 subclass 建构式第一行就呼叫欲使用的 super() 建构式,像这样: public class POOAdvArticle extends POOArticle{ ...... public POOAdvArticle(String a, String b, String[] c) { super(a, b, c); ...... } ...... } 如果想要搞怪一点,还可以这样: public class POOAdvArticle extends POOArticle{ public POOAdvArticle(String[] c) { this("XDD", c); } public POOAdvArticle(String b, String[] c) { this("XD", b, c); } public POOAdvArticle(String a, String b, String[] c) { super(a, b, c); } } 如果在建构式的第一行就遇到呼叫其它建构式,会延缓呼叫 super()的时间。 --- 打这篇花了好久,还是未开始coding T__T, 以上仅提供给大家,有错或看不懂请鞭,愿黑心钢琴商与你同在。 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.204.28.231
1F:推 cwahbong:推一下 04/04 18:01
2F:推 rock1246:感谢 受益良多! 04/04 18:50
3F:推 crazy05:我之前就遇到这问题..姜姜帮我解决的..感谢钢琴PO文XD 04/04 18:56
4F:推 robertabcd:感谢!!! 04/04 20:22
5F:推 ilovejun:推! 04/15 13:40







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Tech_Job站内搜寻

TOP