当前位置: 代码迷 >> J2SE >> 请问一个 继承中覆盖方法之后调用super访问父类完全相同的方法 的有关问题
  详细解决方案

请问一个 继承中覆盖方法之后调用super访问父类完全相同的方法 的有关问题

热度:40   发布时间:2016-04-24 00:24:26.0
请教一个 继承中覆盖方法之后调用super访问父类完全相同的方法 的问题
Java code
import static net.mindview.util.Print.*;class Shape {    Shape(int i) { print("Shape constructor"); }    void dispose() { print("Shape dispose"); }        }class Circle extends Shape {    Circle(int i) {        super(i);        print("Drawing Circle");    }    void Dispose() {        print("Erasing circle");        super.dispose();    }}class Triangle extends Shape {    Triangle(int i) {        super(i);        print("Drawing Triangle");    }        void dipsose() {         print("Erasing Triangle");         super.dispose();        }}class Line extends Shape {    private int start, end;    Line(int start, int end) {        super(start);        this.start = start;        this.end = end;        print("Drawing Line: " + start + ", " + end);     }    void dispose() {        print("Erasing Line: " + start + ", " + end);        super.dispose();    }}public class CADSystem16 extends Shape {    private Circle c;    private Triangle t;    private Line[] lines = new Line[3];    public CADSystem16(int i) {        super(i + 1);        for(int j = 0; j < lines.length; j++)            lines[j] = new Line(j, j*j);        c = new Circle(1);        t = new Triangle(1);        print("Combined constructor");    }    public void dispose() {        print("CADSystem.dispose()");        // The order of cleanup is the reverse        // of the order of initialization        t.dispose();        c.dispose();        for(int i = lines.length - 1; i >= 0; i--)            lines[i].dispose();        super.dispose();    }    public static void main(String[] args) {        CADSystem16 x = new CADSystem16(47);        try {            print("Returning from try block");            return;            // unreachable statement:            // print("You can't see this");            // but finally block will still execute:        } finally {            x.dispose();        }     }    }




能通过编译,运行结果很奇怪:

Shape constructor
Shape constructor
Drawing Line: 0, 0
Shape constructor
Drawing Line: 1, 1
Shape constructor
Drawing Line: 2, 4
Shape constructor
Drawing Circle
Shape constructor
Drawing Triangle
Combined constructor
Returning from try block
CADSystem.dispose()
Shape dispose
Shape dispose
Erasing Line: 2, 4
Shape dispose
Erasing Line: 1, 1
Shape dispose
Erasing Line: 0, 0
Shape dispose
Shape dispose

我的疑问在红色字体的部分
其中Circle和Triangle这两个Shape的子类中的void dispose()没有得到完整的调用,只输出了Shape dispose
但是Line这个Shape子类中的void dispose()却得到了完整的调用:
Erasing Line: 2, 4
Shape dispose

我觉得很矛盾,请问覆盖后的父类方法到底能不能调用?

------解决方案--------------------
楼主
Java code
class Circle extends Shape {    Circle(int i) {        super(i);        print("Drawing Circle");    }    void Dispose() {        print("Erasing circle");        super.dispose();    }}class Triangle extends Shape {    Triangle(int i) {        super(i);        print("Drawing Triangle");    }        void dipsose() {         print("Erasing Triangle");         super.dispose();        }}
------解决方案--------------------
拼错了
还是仔细一点好
还有最好不要这样用
为什么一定要用这么相似的名字
换一个名字吧
------解决方案--------------------
首先不知道楼主在哪里抄来的东西,发在这里害的大家花了那么长时间来帮你调试。

其次您真的重写方法。方法名写错了,建议:加上@Override,在被重写的方法上,但是需要在jdk1.5版本以上,

其他楼主也没问。
就到这里吧。
代码我帮该了:
  相关解决方案