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我觉得很矛盾,请问覆盖后的父类方法到底能不能调用?
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我觉得很矛盾,请问覆盖后的父类方法到底能不能调用?
解决方案 »
- 关于System.in的一个很奇怪的问题
- 帮忙看看为什么运行TestRun会报空指针错误
- Random类下的nextInt()
- 请教:关于在JAVA应用程序中调用服务器的JSP页面,并返回执行结果的问题。
- 问个理论性问题.这里不能用this?this只能在构造方法里用?
- 各位兄弟,帮忙找 简爱英文对白(或剧本),送上200分
- 在JMenuItem中再加菜单用啥方法
- 使用JDBC时,如果在表有几百万条记录,从服务端到客户端如何提高效率,请讨论???
- 一个关于鼠标事件的简单问题,好急!!!!
- 关于JTable行字体颜色设置的问题
- 如何引用方法外的数组?
- java.io.UnsupportedEncodingException: ANSI的问题
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();
}
}这两个方法不是重写了父类的方法,方法名都不一样的,你拼写错了吧,仔细看一下void Dispose()和void dipsose()
就到这里吧。
代码我帮该了:
import java.lang.System;class Shape {
Shape(int i) {
System.out.print("Shape constructor");
} void dispose() {
System.out.print("Shape dispose");
}
}class Circle extends Shape {
Circle(int i) {
super(i);
System.out.println("Drawing Circle");
}
@Override
void dispose() {
System.out.println("Erasing circle");
super.dispose();
}
}class Triangle extends Shape {
Triangle(int i) {
super(i);
System.out.println("Drawing Triangle");
}
@Override
void dispose() {
System.out.println("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;
System.out.println("Drawing Line: " + start + ", " + end);
}
@Override
void dispose() {
System.out.println("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);
System.out.println("Combined constructor");
}
@Override
public void dispose() {
System.out.println("CADSystem.dispose()");
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 {
System.out.println("Returning from try block");
return;
} finally {
x.dispose();
}
}
}
希望楼主记得给分。
^_^