課題10

課題 10
1. 次のプログラムコードを実行し(コピーペーストで構わない)
、なぜそのような結果に
なるのか考えなさい。Java を学習中の友達から、次のような質問を受けたと仮定し、
質問に対する答えを書きなさい。
(1) interface とは何ですか。
(2) Shape クラスに abstract が付いているのはなぜですか。付いていない場合と
何が違うのですか。
(3) Rectangle クラスに draw メソッドが無いとエラーになります。なぜですか。
(4) Rectangle クラスに getArea メソッドが無いとエラーになります。なぜです
か。
(5) main メソッドで Shape 型の配列に Rectangle や Circle、Polyline クラス
のインスタンスを代入していますが、なぜこのようなことができるのですか。
(6) if(shapes[i] instanceof HasGetAreaMethod)とありますが、この意味
を教えてください。
(7) HasGetAreaMethod closedShape = (HasGetAreaMethod)shapes[i];
とありますが、この意味を教えてください。
interface HasGetAreaMethod {
double getArea();
}
abstract class Shape {
abstract void draw();
}
class Rectangle extends Shape implements HasGetAreaMethod {
int width;
int height;
Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
void draw() {
System.out.println("□");
}
public double getArea() {
return width * height;
}
}
class Circle extends Shape implements HasGetAreaMethod {
int radius;
Circle(int radius) {
this.radius = radius;
}
void draw() {
System.out.println("○");
}
public double getArea() {
return radius * radius * 3.14159;
}
}
class Polyline extends Shape {
void draw() {
System.out.println("N");
}
}
public class PolymorphismExample {
public static void main(String[] args) {
Shape[] shapes = new Shape[6];
shapes[0] = new Rectangle(2,5);
shapes[1] = new Circle(7);
shapes[2] = new Polyline();
shapes[3] = new Rectangle(3,8);
shapes[4] = new Circle(3);
shapes[5] = new Polyline();
for(int i = 0; i < shapes.length; i++) {
System.out.println(i + "番目の図形");
printOutShape(shapes[i]);
if(shapes[i] instanceof HasGetAreaMethod) {
HasGetAreaMethod closedShape = (HasGetAreaMethod)shapes[i];
printOutArea(closedShape);
} else {
System.out.println("面積を求められない図形");
}
}
}
static void printOutShape(Shape shape) {
System.out.println("図形の形");
shape.draw();
}
static void printOutArea(HasGetAreaMethod closedShape) {
System.out.println("図形の面積:" + closedShape.getArea());
}
}