下面程序中输出
*******
C
*******
有点不理解的地方是
程序的执行顺序我大概画了个图
问题是
执行到new circle("C").paint()的时候,发现circle里面没有paint方法,那么是如何最终输出 C 的呢?
package pe201101;
abstract class Shape{
public Shape(String name){
this.name = name;
}
abstract void paint();
String getName(){
return this.name;
}
final String name;
};
class Ellipse extends Shape{
public Ellipse(String name){
super(name);
}
void paint(){
System.out.println(getName());
}
};
class Circle extends Ellipse{
public Circle(String name){
super(name);
}
};
class Diagram{
private Shape shapes[] = new Shape[2];
public void drawAShape(Shape shape){
shape.paint();
}
void drawShapes(){
shapes[0] = new Circle("C");
drawAShape(shapes[0]);
}
}
public class java {
public static void main(String[] args) {
Diagram diagram = new Diagram();
diagram.drawShapes();
}
}
------解决思路----------------------
当你调用一个方法时,如果当前对象没有,则会沿着它的继承链依次向上寻找,直到最上层的Object类,如果还是找不到,会报错,找到了,执行它,并停止寻找。
在你这个例子中,Circle中找不到paint()方法,就去它的父类Ellipse中找,结果,找到了,执行它,于是,C被输出出来了。