#様々な図形の面積を求めるいくつかのインスタンスを別のクラスで番号をつけてランダムに実行するプログラムが描きたいです。
サブクラスはそれぞれRectangle,Circle1,Triangle,Squareです。
##スーパークラスは以下の通りに作りました。
java
1package object; 2 3public abstract class Figure { 4 5 double area = 0; 6 abstract double getArea(); 7 abstract void identify(); 8 9 final String name; 10 public Figure(String name) { 11 this.name = ""; 12 13 } 14 public Figure(){ 15 this.name = ""; 16 } 17 @Override 18 public String toString() { 19 return name + ":" + String.format("%.1f", getArea()); 20 } 21 22 23} 24
###これらのサブクラスをFiguresというクラスに入れてランダムに面積をコンソールに表示したいです。
java
1package object; 2 3import java.util.Random; 4import java.util.concurrent.ThreadLocalRandom; 5 6public class Figures{ 7 public static void main(String[] args) { 8 Figure[] figures1 = new Figure[8]; 9 Figure[] figures2 = figures1.clone(); 10 Figure temp; 11 12 Rectangle r1 = new Rectangle(); 13 Rectangle r2 = new Rectangle(30, 20); 14 int i = 0; 15 16 figures1[i++] = r1; 17 figures1[i++] = r2; 18 19 Circle1 c1 = new Circle1(); 20 Circle1 c2 = new Circle1(25); 21 figures1[i++] = c1; 22 figures1[i++] = c2; 23 24 System.out.println("The area of c1 is" + c1.getArea()); 25 System.out.println("The area of c2 is" + c2.getArea()); 26 27 Triangle t1 = new Triangle(); 28 Triangle t2 = new Triangle(30, 20); 29 Triangle t3 = new Triangle(300, 200); 30 System.out.println("The area of t1 is" + t1.getArea()); 31 System.out.println("The area of t2 is" + t2.getArea()); 32 System.out.println("The area of t3 is" + t3.getArea()); 33 34 figures1[i++] = t1; 35 figures1[i++] = t2; 36 figures1[i++] = t3; 37 38 Square2 s1 = new Square2(); 39 Square2 s2 = new Square2(20); 40 System.out.println("The area of s1 is " + s1.getArea()); 41 System.out.println("The area of s2 is " + s2.getArea()); 42 43 figures1[i++] = s1; 44 figures1[i++] = s2; 45 46 47 48 Figure[] cloneShuffle;Figure[] figures;{ 49 Figure[] result = figures.clone(); 50 Random rnd = ThreadLocalRandom.current(); 51 for (int k = result.length - 1; k > 0; k--) { 52 int index = rnd.nextInt(k + 1); 53 Figure temp1 = result[index]; 54 result[index] = result[k]; 55 result[k] = temp1; 56 } 57 return; 58 } 59 60 for(i=0;i<figures2.length;i++) { 61 62 63System.out.println(figures2[i].getClass().getName()+":"+figures2[i].getArea()); 64 } 65} 66 67///図形の説明 68class Figure{ 69 int count = 0; 70 double area =0; 71 double getArea() { 72 return 0; 73 } 74} 75class Rectangle extends Figure{ 76 77 int width; 78 int height; 79 String name="Rectangle"; 80 81 Rectangle(){ 82 setSize(10,20); 83 } 84 85 Rectangle(int width,int height){ 86 setSize(width,height); 87 } 88 89 void setSize(int w,int h) { 90 width=w; 91 height=h; 92 } 93 94 double getArea() { 95 return width*height; 96 } 97} 98class Circle extends Figure{ 99 int r; 100 String name="Circle"; 101 Circle(){ 102 setSize(5); 103 } 104 Circle(int r){ 105 setSize(r); 106 } 107 108 void setSize(int r){ 109 this.r=r; 110 } 111 double getArea() { 112 return r*r*Math.PI; 113 } 114} 115} 116 117
####このコードを実行すると、
figures1[i++] = r1;
figures1[i++] = r2;
は格納されるのですが、残りのCircle1,Triangle,Squareがうまく格納されず「型の不一致: Circle1 から Figures.Figure には変換できません」というエラーメッセージが表示されてしまいます。
RectangleのコードとCircle1のコードは以下のように描きました。
java
1 package object; 2 3import java.util.concurrent.atomic.AtomicInteger; 4 5public class Rectangle extends Figure { 6 private double height = 0; 7 private double width = 0; 8 9 static final String NAME = Rectangle.class.getSimpleName(); 10 static final java.util.concurrent.atomic.AtomicInteger counter = new AtomicInteger(0); 11 12 13 Rectangle(){ 14 this.width = 20; 15 this.height = 10; 16 } 17 Rectangle(double w, double h){ 18 this.width = w; 19 this.height = h; 20 } 21 void setWidth(double w) { 22 this.width = w; 23 } 24 void setHeight(double h) { 25 this.height = h; 26 } 27 void setSize(double w, double h) { 28 setWidth(w); 29 setHeight(h); 30 } 31 double getWidth() { 32 return this.width; 33 } 34 double getHeight() { 35 return this.height; 36 } 37 38 Rectangle(int width, int height){ 39 super(NAME + counter.addAndGet(1)); 40 this.width = width; 41 this.height = height; 42 } 43 44 @Override 45 double getArea() { 46 return width * height; 47 } 48 void identify() { 49 System.out.println("I am a rectangle with area" + getArea() + "."); 50 } 51} 52
java
1package object; 2 3import java.util.concurrent.atomic.AtomicInteger; 4 5public class Circle1 extends Figure { 6 private double radius = 0; 7 8 static final String NAME = Rectangle.class.getSimpleName(); 9 static final java.util.concurrent.atomic.AtomicInteger counter = new AtomicInteger(0); 10 11 Circle1(){ 12 this.radius = 20; 13 } 14 15 void Circle(double r){ 16 this.radius = r; 17 } 18 void setRadius(double r) { 19 } 20 void setSize(double r) { 21 setRadius(r); 22 } 23 double getRadius() { 24 return this.radius; 25 } 26 Circle1(int r){ 27 super(NAME + counter.addAndGet(1)); 28 this.radius = r; 29 30 } 31 @Override 32 double getArea() { 33 area = Math.PI * this.radius * this.radius; 34 return area; 35 // TODO 自動生成されたメソッド・スタブ 36 } 37 void identify() { 38 System.out.println("I am a Circle1 with area" + getArea() + "and" + getNumber() + "."); 39 // TODO 自動生成されたメソッド・スタブ 40 41 } 42 private String getNumber() { 43 // TODO 自動生成されたメソッド・スタブ 44 return null; 45 } 46 @Override 47 void iduntify() { 48 // TODO 自動生成されたメソッド・スタブ 49 50 } 51 52} 53
型の不一致というエラーはStringとintの時によくみられるエラーですが、今回私は全てint型で書いているつもりで、なぜRectangleは実行できたのに他のものが実行できなかったのかがわかりませんでした。試しにRectangleとCircleの順を変えてみたのですが結果は同じでした。
初心者で理解が甘い部分があるかと思います。何かわかるかたがいらっしゃいましたらご回答をお願いします。
回答2件
あなたの回答
tips
プレビュー