下图程序中我用画笔画了一下执行的过程,但是到了第7步就不知道程序是怎么执行的了
因为第7步中的shape是circle类型的,所以程序会找circle类里面的paint(),但是circle里面并没有paint(),所以程序到底是如何进行后续的操作的就不太理解了。
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);
System.out.println("Ellipse");
}
void paint(){
System.out.println(getName());
}
};
class Circle extends Ellipse{
public Circle(String name){
super(name);
System.out.println("Circle");
}
};
class Diagram{
private Shape shapes[] = new Shape[2];
public void drawAShape(Shape shape){
shape.paint();
}
/*void eraseAShape(Shape shape){
shape
}*/
void drawShapes(){
Circle a = new Circle("C");
drawAShape(a);
/* shapes[1] = new Ellipse("E");
for(int i=0;i<2;i++){
drawAShape(shapes[i]);
}*/
}
/*void close(){
for(int i=0;i<2;i++){
}
}*/
}
public class doo1 {
public static void main(String[] args) {
Diagram diagram = new Diagram();
diagram.drawShapes();
}
}
------解决思路----------------------
第7步public void drawAShape(Shape shape){
shape.paint();
}这里shape的实参是Circle a = new Circle("C");
就是调用a.paint(),Circle类虽然没有定义paint()方法,但是其父类定义了,
void paint(){
System.out.println(getName());
}
相当于System.out.println(a.getName());同样Circle类虽然没有定义getName(),但是其父类的父类定义了,
String getName(){
return this.name;
}
就是返回当前对象的name成员变量,这个name继承自Shape,在初始化的时候赋值为C