调用超类的方法时发生StackOverflow错误- Java [重复]

ruyhziif  于 2023-01-15  发布在  Java
关注(0)|答案(1)|浏览(138)
    • 此问题在此处已有答案**:

Why do I get StackOverflowError [duplicate](1个答案)
2天前关闭。
我有一个类,它调用超类的一个简单方法,如下所示:

class A {
        public void doPrint() {
            print();
        }

        public void print() {
            System.out.println("A");
        }
    }
class B extends A {
    public void doPrint() {
        print();
    }
    
    public void print() {
        super.print();
    }
}

class C extends B {
    public void print() {
        super.doPrint(); // Line 163
    }

    public static void main(String[] args) {
        C c = new C();
        c.print();
    }
}

但是,当我运行这个程序时,我得到一个堆栈溢出错误:

Exception in thread "main" java.lang.StackOverflowError
    at B.doPrint(B.java:5)
    at C.print(C.java:6)
    at B.doPrint(B.java:5)
    at C.print(C.java:6)
    at B.doPrint(B.java:5)
    at C.print(C.java:6)
    at B.doPrint(B.java:5)
    at C.print(C.java:6)
    at B.doPrint(B.java:5)
    at C.print(C.java:6)

我不确定这是怎么发生的。据我所知,我没有进行任何递归调用。super.doPrint()正在调用超类的方法,而不是当前类的方法。我不确定出了什么问题。

0yg35tkg

0yg35tkg1#

从类B中删除覆盖,否则,它将从C中调用cyclic,在类C中,您覆盖print方法,因此在类C print方法中,您调用Super的doPrint,类B的doPrint方法调用,但doPrint调用带有 this 示例的print,this 示例是类C的对象,它变为循环并卡在StackOverflow中,此处是更新一

public class C extends B {
    @Override
    public void print() {
        System.out.println("TEST PRINT ");
        this.doPrint(); // Line 163
    }

    public static void main(String[] args) {
        C c = new C();
        c.print();
    }
}

class A {
    public void doPrint() {
        System.out.println("A DO PRINT");
        this.print();
    }

    public void print() {
        System.out.println("A PRINT ");
    }
}

class B extends A {

    @Override
    public void doPrint() {
        super.print();
    }

    //  @Override
    //  public void print() {
    //      System.out.println(" B PRINT ");
    //      super.print();
    //  }
}

相关问题