当前位置: 技术问答>java相关
thinkinjava里得,不明白,super???
来源: 互联网 发布时间:2015-06-14
本文导语: class Cleanser { private String s = new String("Cleanser"); public void append(String a) { s += a; } public void dilute() { append(" dilute()"); } public void apply() { append(" apply()"); } public void scrub() { append(" scrub()");...
class Cleanser {
private String s = new String("Cleanser");
public void append(String a) { s += a; }
public void dilute() { append(" dilute()"); }
public void apply() { append(" apply()"); }
public void scrub() { append(" scrub()"); }
public void print() { System.out.println(s); }
public static void main(String[] args) {
Cleanser x = new Cleanser();
x.dilute(); x.apply(); x.scrub();
x.print();
}
}
public class Detergent extends Cleanser {
// Change a method:
public void scrub() {
append(" Detergent.scrub()");
super.scrub(); // Call base-class version
}
// Add methods to the interface:
public void foam() { append(" foam()"); }
// Test the new class:
public static void main(String[] args) {
Detergent x = new Detergent();
x.dilute();
x.apply();
x.scrub();
x.foam();
x.print();
System.out.println("Testing base class:");
Cleanser.main(args);
}
} ///:~
树种解释:
在scrub()里,不可只是简单地发出对scrub()的调用。那样便造成了递归调用,我们不愿看到这一情况。为解决这个问题,Java提供了一个super关键字,它引用当前类已从中继承的一个“超类”(Superclass)。所以表达式super.scrub()调用的是方法scrub()的基础类版本。
大家看看怎么就递归了?
private String s = new String("Cleanser");
public void append(String a) { s += a; }
public void dilute() { append(" dilute()"); }
public void apply() { append(" apply()"); }
public void scrub() { append(" scrub()"); }
public void print() { System.out.println(s); }
public static void main(String[] args) {
Cleanser x = new Cleanser();
x.dilute(); x.apply(); x.scrub();
x.print();
}
}
public class Detergent extends Cleanser {
// Change a method:
public void scrub() {
append(" Detergent.scrub()");
super.scrub(); // Call base-class version
}
// Add methods to the interface:
public void foam() { append(" foam()"); }
// Test the new class:
public static void main(String[] args) {
Detergent x = new Detergent();
x.dilute();
x.apply();
x.scrub();
x.foam();
x.print();
System.out.println("Testing base class:");
Cleanser.main(args);
}
} ///:~
树种解释:
在scrub()里,不可只是简单地发出对scrub()的调用。那样便造成了递归调用,我们不愿看到这一情况。为解决这个问题,Java提供了一个super关键字,它引用当前类已从中继承的一个“超类”(Superclass)。所以表达式super.scrub()调用的是方法scrub()的基础类版本。
大家看看怎么就递归了?
|
在class Detergent里引用他本身的scrub()方法就造成递归
相当于
public void scrub() {
append(" Detergent.scrub()");
scrub(); // Call base-class version
}
在执行第三行时又回到第一行开始执行。
所以书里scrub() 用super.scrub()引用它的父类clean.scrub()方法
相当于
public void scrub() {
append(" Detergent.scrub()");
scrub(); // Call base-class version
}
在执行第三行时又回到第一行开始执行。
所以书里scrub() 用super.scrub()引用它的父类clean.scrub()方法
|
因为你的scrub()在其内部又要调用scrub(),如果没有super这个关键字的话,他会自动调用你当前类的重载版本,也就造成了自己在内部调用自己的情况,也就造成了低轨。用了super以后,他调用的就是他基类的scrub(),也就是另一个不同的方法,所以就没有递归了。
|
自己调用自己,是很明显的递归,如果用super,调用夫类的函数自然就不递归了
|
用super调用父类的方法,因为如果在继承方法中调用等于是自己调用自己,永无止境!