作者s864372002 (钢琴)
看板b98902HW
标题[JAVA] 上层类别-super
时间Sun Apr 4 16:51:09 2010
经过一番折腾我终於发现上课时连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