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)

解决方案 »

  1.   


    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); 

    }
      

  2.   

    你只能有一个public class,jvm会执行其中的main方法,你如果有2个public class,jvm就不知道去执行哪个main方法了
      

  3.   

     private Detergent a=new Detergent(); 
    这句话有问题,看编译器的提示应该是一直调用初始化方法,导致内存不足,堆栈溢出的错误
      

  4.   

    public static void main(String[] args) { 
    ......
    Cleanser.main(args); // 递归调用,始终没有返回,也就是一直调用下去,知道栈溢出。
      

  5.   


    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
      

  6.   

    按照6楼的改了 但在eclipse上还是运行有错误:Exception in thread "main" java.lang.StackOverflowError
    at Detergent.<init>(Detergent.java:16)
    at Detergent.<init>(Detergent.java:16)
    at Detergent.<init>(Detergent.java:16)
    at Detergent.<init>(Detergent.java:16)
      

  7.   

    private Detergent a=new Detergent(); 造成的,不断new对象,造成内存(堆区)溢出
    改为private static Detergent a=new Detergent(); 
      

  8.   

    奇怪,我运行的时候没有错误啊,不过我6楼的代码最后掉了个"}"号倒是真的,你加上试试,可能编译器的不通吧,我没用eclipseCleanser.main(args); 
    }