public class Cleanser {
private String s="Cleanser";
public void append(String a){s+= a;}
public void dilute(){append("dilute()");}
public void apply(){append("apply()");}
public void scrub(){append("scrub()");}
public String toString(){return s;}
public static void main(String[] args) {
Cleanser x=new Cleanser();
x.dilute();x.apply();x.scrub();
System.out.println(x);
}
}public class Detergent extends Cleanser {
private Detergent a=new Detergent();
public void scrub(){
a.append("Detergent.scrub()");
super.scrub();
}
public void foam(){
a.append("foam()");
}
public static void main(String[] args) {
Detergent x=new Detergent();
x.dilute();
x.apply();
x.scrub();
x.foam();
System.out.println(x);
System.out.println("Testing base class:");
Cleanser.main(args);
}
}编译器提示的:Exception in thread "main" java.lang.StackOverflowError
at Detergent.<init>(Detergent.java:3)
at Detergent.<init>(Detergent.java:3)
at Detergent.<init>(Detergent.java:3)
at Detergent.<init>(Detergent.java:3)
at Detergent.<init>(Detergent.java:3)
private String s="Cleanser";
public void append(String a){s+= a;}
public void dilute(){append("dilute()");}
public void apply(){append("apply()");}
public void scrub(){append("scrub()");}
public String toString(){return s;}
public static void main(String[] args) {
Cleanser x=new Cleanser();
x.dilute();x.apply();x.scrub();
System.out.println(x);
}
}public class Detergent extends Cleanser {
private Detergent a=new Detergent();
public void scrub(){
a.append("Detergent.scrub()");
super.scrub();
}
public void foam(){
a.append("foam()");
}
public static void main(String[] args) {
Detergent x=new Detergent();
x.dilute();
x.apply();
x.scrub();
x.foam();
System.out.println(x);
System.out.println("Testing base class:");
Cleanser.main(args);
}
}编译器提示的:Exception in thread "main" java.lang.StackOverflowError
at Detergent.<init>(Detergent.java:3)
at Detergent.<init>(Detergent.java:3)
at Detergent.<init>(Detergent.java:3)
at Detergent.<init>(Detergent.java:3)
at Detergent.<init>(Detergent.java:3)
class Cleanser {
private String s = "Cleanser";
public void append(String a) {
s += a;
} public void dilute() {
append(" dilute()");
} public void apply() {
append(" apply()");
} public void scrub() {
append(" scrub()");
} public String toString() {
return s;
} public static void main(String[] args) {
Cleanser x = new Cleanser();
x.dilute();
x.apply();
x.scrub();
System.out.println(x);
}
} 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();
System.out.println(x);
System.out.println("Testing base class:");
Cleanser.main(args);
}
}
这句话有问题,看编译器的提示应该是一直调用初始化方法,导致内存不足,堆栈溢出的错误
......
Cleanser.main(args); // 递归调用,始终没有返回,也就是一直调用下去,知道栈溢出。
}
class Cleanser {
private String s="Cleanser";
public void append(String a){s+= a;}
public void dilute(){append("dilute()");}
public void apply(){append("apply()");}
public void scrub(){append("scrub()");}
public String toString(){return s;}
public static void main(String[] args) {
Cleanser x=new Cleanser();
x.dilute();x.apply();x.scrub();
System.out.println(x);
}
} public class Detergent extends Cleanser {
private Detergent a=new Detergent();
public void scrub(){
a.append("Detergent.scrub()");
super.scrub();
}
public void foam(){
a.append("foam()");
}
public static void main(String[] args) {
Detergent x=new Detergent();
x.dilute();
x.apply();
x.scrub();
x.foam();
System.out.println(x);
System.out.println("Testing base class:");
Cleanser.main(args);
}
去掉public就行了,程序名为Detergent
at Detergent.<init>(Detergent.java:16)
at Detergent.<init>(Detergent.java:16)
at Detergent.<init>(Detergent.java:16)
at Detergent.<init>(Detergent.java:16)
改为private static Detergent a=new Detergent();
}
}