• ベストアンサー

java 継承

こんにちは。 javaの問題なのですが、問題文が理解できなかったので質問させていただきます。 問題文 Ex54で作成したRectangleクラスを継承するPlaceRectangleクラスを作成する Ex54 import java.io.*; class Rectangle{ private int width; private int height; public Rectangle(){ width=0; height=0; } public Rectangle(int w, int h){ width=w; height=h; } public int getArea(){ return width*height; } } class Ex54{ public static void main(String args[])throws IOException{ BufferedReader br = new BufferedReader (new InputStreamReader(System.in)); int num=0; while(num < 2){ System.out.print(">"); String wid = br.readLine(); System.out.print(">"); String hei = br.readLine(); int num1 = Integer.parseInt(wid); int num2 = Integer.parseInt(hei); Rectangle rectangle1 = new Rectangle(num1, num2); System.out.println("インスタンスr" + (num+1) + "の面積は" + rectangle1.getArea()); num++; } } } --------------------------------------------------------------- PlacedRectangleクラス 四角形の位置をx座標y座標で表す。 長方形の左端を示しx座標は右に大きくy軸は下に大きくなる。 ・次の三つのコンストラクタを持つ (1)引数なし (2)位置の引数付き (3)位置と大きさの引数付き いづれのコンストラクタも位置のセットはsetLocationメソッドを実行する 大きさのセットはスーパークラスのコンストラクタを呼ぶ (コンストラクタで値を設定しているのになぜ再設定(位置のセット、大きさのセット)する必要があるのか分かりません。) ・setLocationメソッドは位置をセットする mainメソッドから次の操作をする 1引数無しでPalacedRectangleのインスタンスaを作成 2引数12と34でPlacedRectangleのインスタンスbを作成 3引数31と41と59と26でPlacedRectangleのインスタンスcを作成 1、2、3ともそれぞれのインスタンスの位置と面積を表示する 実行例 インスタンスaの面積は1534 位置は(12,13)です。 UML図 PlacedRectangle ----------------- -x:int -y:int ----------------- +PlacedRectangle() +PlacedRectangle(x:int,y:int) +PlacedRectangle(x:int,y:int,width:int,height:int) +setLocation(x:int,y:int):void 「疑問点」 コンストラクタで値を設定しているのになぜ再設定(位置のセット、大きさのセット)する必要があるのか分かりません。 main文のwhile(num < 2){というところをスッキリさせたい(処理が2回しかないため)何かよい方法はないでしょうか? よろしくおねがいします。

noname#39315
noname#39315
  • Java
  • 回答数3
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • kztk
  • ベストアンサー率53% (59/110)
回答No.2

コンストラクタの名前(PlaceRectangle)とクラス名(PlacedRectangle)が一致していないからです。 一致していないので、コンストラクタではなくPlaceRectangleという名前のメソッドだと解釈されていて、戻り値がないと怒られています。 x軸y軸の表示は・・・ 私なら、PlacedRectangleにgetX():int, getY():intを作り、 Ex70側で System.out.println("位置は(1" + r1.getX() + "," + r1.getY() + ")です。") とします。 あるいは位置を表示するだけのshowLocation()のようなものをPlacedRectangleに作るか

noname#39315
質問者

お礼

ご回答ありがとうございました。 エラーメッセージが「戻り値の型が必要です」 という表示があったのでそっちばかりに気がいってしまって コンストラクタとクラス名の記述には 気が回っていませんでした・・・ x,y軸の表示は専用のメソッドを作り、見やすくなりました。 ありがとうございました^^

noname#39315
質問者

補足

ご回答ありがとうございます。 プログラムはこんな感じになったのですが class Rectangle{ private int width; private int height; public Rectangle(){ width=0; height=0; } public Rectangle(int w, int h){ width=w; height=h; } public int getArea(){ return width*height; } } class PlacedRectangle extends Rectangle{ private int x; private int y; public PlacedRectangle(){ setLocation(0,0); } public PlacedRectangle(int x, int y){ setLocation(x,y); } public PlacedRectangle(int x, int y, int w, int h){ super(w, h); setLocation(x,y); } void setLocation(int x,int y){ this.x=x; this.y=y; } void showLocation(){ System.out.println("位置は" + x + "," + y + "です。"); } } class Ex70{ public static void main(String args[]){ PlacedRectangle a = new PlacedRectangle(); System.out.println("インスタンスaの面積は" + a.getArea() + "です。"); a.showLocation(); PlacedRectangle b = new PlacedRectangle(12,34); System.out.println("インスタンスbの面積は" + a.getArea() + "です。"); b.showLocation(); PlacedRectangle c = new PlacedRectangle(31,41,59,26); System.out.println("インスタンスcの面積は" + a.getArea() + "です。"); c.showLocation(); } } インスタンスcの面積が0と表示されるばかりで 思うような結果が得られません。 どなたかアドバイスをお願いいたします。

その他の回答 (2)

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.3

mainメソッド内をもう一度チェックしてみましょう。 # これくらい自分で気づけないとダメです。 # コピー&ペーストでソースを作ることが危険なことを理解しましょう。

noname#39315
質問者

お礼

私の補足にお気づきありがとうございます。 次回からはコピペする際はただやみ雲にするのではなく ちゃんと意味を把握しながら行っていきたいと思います。 ご回答ありがとうございました^^

  • kztk
  • ベストアンサー率53% (59/110)
回答No.1

>コンストラクタで値を設定しているのになぜ再設定(位置のセット、 >大きさのセット)する必要があるのか分かりません。 「再設定」ですか?たぶん問題文を読み間違えたのかな? コンストラクタの中でのセットの仕方を言っているのだと思いますよ? >いづれのコンストラクタも >位置のセットはsetLocationメソッドを実行する >大きさのセットはスーパークラスのコンストラクタを呼ぶ 例えばこういう↓書き方はせずに、 public PlacedRectangle(){ this.x = 0; this.y = 0; } public PlacedRectangle(int x; int y){ this.x = x; this.y = y; } こういう↓風にしてよ、ってことです。 public PlacedRectangle(){ this.setLocation(0, 0) } public PlacedRectangle(int x; int y){ this.setLocation(x, y); } public void setLocation(int x, int y){ this.x = x; this.y = y; } 大きさの設定はちょっと自分で考えてみてください。 スーパークラスのコンストラクタを呼ぶというところを正しく理解することがこの課題のキモだと思いますので。 #しかし、ものすごい勢いで課題をこなしてますねえ(笑)

noname#39315
質問者

補足

ご丁寧に解説頂きありがとうございます。 プログラムが完成したかと思ったのですがコンパイルエラーが起きてしまったみたいです。 class Rectangle{ private int width; private int height; public Rectangle(){ width=0; height=0; } public Rectangle(int w, int h){ width=w; height=h; } public int getArea(){ return width*height; } } class PlacedRectangle extends Rectangle{ private int x; private int y; public PlaceRectangle(){ this.setLocation(0,0); } public PlaceRectangle(int x, int y){ this.setLocation(x,y); } public PlaceRectangle(int x, int y, int width, int height){ super(width, height); this.setLocation(x, y); } public void setLocation(){ this.x=x; this.y=y; println("位置は" + x + y + "です。"); } } class Ex70{ public static void main(String args[]){ PlaceRectangle a = new PlaceRectangle(); println("インスタンスaの面積は" + a.getArea() + "です。"); PlaceRectangle b = new PlaceRectangle(12,34); println("インスタンスbの面積は" + a.getArea() + "です。"); PlaceRectangle c = new PlaceRectangle(31,41,59,26); println("インスタンスcの面積は" + a.getArea() + "です。"); } } このような感じに仕上がったのですが public PlaceRectangle(){ this.setLocation(0,0); } public PlaceRectangle(int x, int y){ this.setLocation(x,y); } public PlaceRectangle(int x, int y, int width, int height){ super(width, height); this.setLocation(x, y); } この3箇所の部分で「メソッドの宣言が不正です。戻り値の型が必要です」とのメッセージでした。 ちなみにpublic void setLocation(){ this.x=x; this.y=y; System.out.println("位置は" + x + y + "です。"); } } の部分でx軸y軸の表示を行っても大丈夫でしょうか どなたかよろしくお願いします。

関連するQ&A

  • java

    javaの問題がわかりません。 問題文は以下の通りです。 幅と高さを指定するコンストラクタ内で作ったr1とr2というインスタンスの 内容をmain()メソッドで表示する。 〔クラス図〕 クラス名 Rectangle ---------- -width:int -height:int ---------- Rectangle() Rectangle(w:int, h:int) getArea():int ------------- getArea()メソッドでは面積(高さ×幅) コンストラクタRectangle()では、widthとheightに初期値0を設定 main()メソッドでは標準入力より幅と高さを整数として受け取り コンストラクタの引数にする。 よろしくおねがいします。 途中経過 class Rectangle{ private int width; private int height; public Rectangle(???){ width = 0; height = 0; } class MENSEKI{ public static void main(String args[]){ }

    • ベストアンサー
    • Java
  • 問題が解けません(インスタンスメソッド)

    こんにちは。 課題をやっているのですが、問題が解けません。 問題内容です。 以下のクラス図で示したRectangleクラスを作成し、実行結果と同じに なるようにメソッドを作成する。 クラス図 Rectangle -width:ing -height:int ----------- Rectangle() Rectangle(w:int,h:int) getArea():int ------------- 問題文 getArea()メソッドでは面積の計算をする(高さ×幅) コンストラクタRectangle()ではwidthとheightに初期値0を設定。 main()メソッドでは標準入力より幅、高さを整数として受け取り コンストラクタの引数とする。 実行結果 >10 >20 インスタンスr1の面積は200 >123 >45 インスタンスr2の面積は5535 -------------------------- 途中経過 import java.io.*; class Rectangle{ public static int sum=0; private int width; private int height; public Rectangle(){ width=0; height=0; sum++; } public void Rectangle(int w, int h){ width=w; height=h; } public void getArea(){ int num; num=width*height; System.out.println("r" + sum + "インスタンスの面積は" + num); } } class Ex54{ public static void main(String args[]){ BufferedReader input = new BufferedReader (new InputStreamReader(System.in)); String wid = input.readLine(); String hei = input.readLine(); Rectangle rectangle1 = new Rectangle(); rectangle1.Rectangle(wid, hei); } } 「現在の問題点」 UML図の通り記述できているか自信がありません。 rectangle1.Rectangle(wid, hei);というところでエラーが出てしまいます。 r1、r2を表示するときにsumを使っているのですがこのような記述でいいか自身がありません。 どなたかよろしくお願いします。

    • ベストアンサー
    • Java
  • Javaの基礎のプログラム

    結城浩さんの本に載っていたプログラムです。 ですが、説明がわかりにくくていまいち処理がわからなかったので 質問させていただきました。 どうやら、X軸とY軸がありY軸は下に行けばいくほど数字が大きくなる。 X軸は右に行けばいくほど大きくなる。座標上にある、二つの長方形の重なりあう部分の座標を求めるプログラムのようです。(イメージとしては、下に添付してある画像のような感じになるようです。) 質問としては一つです。 プログラム中のこの部分なのですが、おそらく「長方形の座標を示している」行であると思います。 a = new Rectangle(0, 0, 20, 10); b = new Rectangle(5, 5, 20, 10); c = new Rectangle(20, 10, 20, 10); d = new Rectangle(-10, -20, 100, 200); e = new Rectangle(21, 11, 20, 10); その後の処理としては、aとb→c→d→eというようにそれぞれ比較していっているのもなんとなくわかります。 ですが、しっかり解説されていなかったので、この4つの数字がどのように座標を示しているのかよくわかりませんでした。 よろしくお願いします。 class Rectangle { final int INITIAL_WIDTH = 10; final int INITIAL_HEIGHT = 20; int width; int height; int x; int y; Rectangle() { width = INITIAL_WIDTH; height = INITIAL_HEIGHT; x = 0; y = 0; } Rectangle(int width, int height) { this.width = width; this.height = height; this.x = 0; this.y = 0; } Rectangle(int x, int y, int width, int height) { this.width = width; this.height = height; this.x = x; this.y = y; } void setLocation(int x, int y) { this.x = x; this.y = y; } void setSize(int width, int height) { this.width = width; this.height = height; } public String toString() { return "[" + x + ", " + y + ", " + width + ", " + height + "]"; } Rectangle intersect(Rectangle r) { int sx = Math.max(this.x, r.x); int sy = Math.max(this.y, r.y); int ex = Math.min(this.x + this.width, r.x + r.width); int ey = Math.min(this.y + this.height, r.y + r.height); int newwidth = ex - sx; int newheight = ey - sy; if (newwidth > 0 && newheight > 0) { return new Rectangle(sx, sy, newwidth, newheight); } else { return null; } } public static void main(String[] args) { Rectangle a, b, c, d, e; a = new Rectangle(0, 0, 20, 10); b = new Rectangle(5, 5, 20, 10); c = new Rectangle(20, 10, 20, 10); d = new Rectangle(-10, -20, 100, 200); e = new Rectangle(21, 11, 20, 10); System.out.println("a = " + a); System.out.println("b = " + b); System.out.println("c = " + c); System.out.println("d = " + d); System.out.println("e = " + e); System.out.println("a と a の重なり = " + a.intersect(a)); System.out.println("a と b の重なり = " + a.intersect(b)); System.out.println("a と c の重なり = " + a.intersect(c)); System.out.println("a と d の重なり = " + a.intersect(d)); System.out.println("a と e の重なり = " + a.intersect(e)); } }

    • ベストアンサー
    • Java
  • パッケージ化とコンパイルについて

    下記のプログラムにについての質問になります。 /*Rectangle.java*/ package com.shoeisha.shape; public class Rectangle { private int width; private int height; public Rectangle() { } public Rectangle(int width, int height) { this.width = width; this.height = height; } public int getArea(){ return width * height; } } /*Test.java*/ import com.shoeisha.shape.*; ^^(1) class Test { public static void main(String[] args) { Rectangle rc = new Rectangle(10, 15); System.out.println(rc.getArea()); } } (1)の箇所になりますが、com.shoeisha.shapeにあるクラス(Rectangle)を 利用し、プログラムを作成しようと思うのですが、Test.javaにてコンパイルエラーが生じてしまいます。 (1)の箇所をRectangleにするとコンパイルが通るようになり、「*」は使えないものかと思えてしまいます。 java.util.*;といった、既に用意されているものは普通に使えるのですが、自作でパッケージ化した物は 正規表現を使うことができないものなんでしょうか?? 何かの設定がされていないから、正規表現が使えないのではと思っておりますが、 それ以上がわかりませんでしたので、掲示板にて記載させていただきました。 以上、ご教授の程お願い致します。

    • ベストアンサー
    • Java
  • java の配列についての質問です。

    java の配列についての質問です。 java 及び C++についての知識は初心者です。 public abstract class Plan implements Shapeable { Shape[] shape = new Shape[5]; Shape[0] = new Rectangle(10,10,10,10); // x,y 座標 及び 長さ、高さ Shape[1] = new Triangle(10,10,30,10,20,20); // 3点間の座標        Shape[2] = new Triangle(20,10,40,10,30,20);        Shape[3] = new Triangle(15,15,35,15,25,25); Shape[4] = new Circle(20,20,20); // 円の座標と半径     public float[] calculaterAreas(){ ??????????????????? } 内容としては複雑なのですが、三角形、四角形、円の面積をShapeというclassの配列にあるデータ(座標や長さなど) を使ってShapeの配列のデータを置き換えてfloatのデータとして返すんですが・・・・。どうやっていいのかさっぱり わかりません。面積については、Rectangle,Triangle,Circleのクラスでそれぞれ計算できるようになっているのですが、それを持ってくる方法もわかりません・・・どうしたらいいのか教えてください 宜しくお願いします。 ちなみに Rectangle,Triangle,Circle class の area の メソットは --- Rectangle class public class Rectangle extends Shape{ int x; int y; int width; int height; public float area(Rectangle r) { return r.width * r.height; } --- Circle class public class Circle extends Shape{ int x; int y; int radius; public float area(Circle c) { return (float) (c.x * c.y * 3.14); } } --- Triangle class public class Triangle extends Shape{ int x; int y; int x2; int y2; int x3; int y3; public float area(Triangle t) { float dt1,dt2,dt3; float s1; float area1; dt1 = Point.distance(x, y); // Point は dt2 = Point.distance(x2, y2); dt3 = Point.distance(x3, y3); s1 = (dt1+dt2+dt3)/2; area1 = (float) Math.sqrt((s1-dt1)*(s1-dt2)*(s1-dt3)); return area1; } } *** Shape class public abstract class Shape implements Shapeable { public abstract float area(Shape obj); } *** Shapeable インターフェイス public interface Shapeable { float area (Shape obj); } ** コンストラクター等は省略してあります。

    • ベストアンサー
    • Java
  • javaの課題が難しくて解けません。力を貸してください

    本日、プログラムの授業で課題が出されました。 解ける方がいましたら、回答を教えてください。 課題:これまでの演習で作成した Rectangle, Triangle, Circle, Trapezoidクラスを利用するクラス (メインクラス)を修正して, コマンドライン引数から図形の種類、入力値を指定できるようにしてみよ。 ※4つのクラスをpackageで1つにまとめる必要があるようです。 お手数かけますが、宜しくお願いします。 下記が演習で作成した4つのクラスになります。参考にしてください。 (Rectangleクラス) import java.io.*; class Rectangle { private int width; private int height; public Rectangle(int w, int h) { width = w; height = h; } public void setWidth(int w) { width = w; } public void setHeight(int h) { height = h; } public int getWidth() { return width; } public int getHeight() { return height; } public double calcArea() { return width * height; } public void show() { System.out.println("width=" + getWidth() + ", height= " + getHeight()); } } public class kadai1 { public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("width= "); String str1 = br.readLine(); System.out.print("height= "); String str2 = br.readLine(); Rectangle r = new Rectangle(Integer.parseInt(atr1),Integer.parseInt(str2)); r.show(); System.out.println("面積 = " + r.calcArea()); } } (Triangleクラス) public double calcArea() { return width * height / 2.0; } (Circleクラス) public double calcArea() { return Math.PI * radius * radius; } public void show() { System.out.println("radius= " + getRadius()); } (Trapezoidクラス) public double calcArea() { return (upper + lower) * height / 2.0; } public void show() { System.out.println("upper= " + getUpper() + ", lower= " + getLower() + ", height= " + getHeight()); }

  • javaのクラスなど

    現在次のようなクラスを作成していて、自分なりに作ってはみたもののうまく分かりません。 どこが間違っていてどのように修正したらよいのか、詳しく教えてください。 9と10は分かりませんでした。 (1) 次に示す内容を満たすバー(Bar)クラスを作成せよ。 1. バーの右端のx座標(=バーの長さ)、バーの名前を扱う2つのprivateなインスタンス変数を持つ。 2. バーの総数を扱うprivateなクラス変数を持つ。ただし、 ここでいう総数とは、(1)コンストラクタで作成したもの、(2)代入操作で作成したもの、の両方を含む。 3. 引数無しのコンストラクタが呼び出されてバーオブジェクトが作成されると、そのバーのx座標は0以上400未満でランダムに決定され、名前は文字「A」とランダムに決定された0以上10000未満の整数が連接されたものに決定される。 4. バーのx座標を設定するインスタンスメソッドを持つ。 5. バーの名前を設定するインスタンスメソッドを持つ。 6. バーのx座標を取得するインスタンスメソッドを持つ。 7. バーの名前を取得するインスタンスメソッドを持つ。 8. 作成されたバーの総数を取得するクラスメソッドを持つ。 9. 作成されたバーの総数を1増やすクラスメソッドを持つ。 10. 作成されたバーの総数を1減らすクラスメソッドを持つ。 こちらが作ってみたものです。 class Bar{ private int x; private String name; private int count; private Bar(){ x=0; count=0; name=""; } public void Bar(){ x = (int)(Math.random()*400); name = "A" + (int)(Math.random()*10000); } public void setBar(int bx){ x=bx; } public void setName(String nm){ name=nm; } public void getX(int bx){ } public void getName(String nm){ } public void getCount(int c){ } }

    • ベストアンサー
    • Java
  • JAVAのコンストラクタ、継承の問題を回答頼む

    commonパッケージにHeroクラスを継承した、SuperHeroクラスを作成してください * ●HP, POWER, ENDURANCEはHeroと同じでそれぞれ、(25, 10, 7) * フィールド * item : Item * メソッド * attackメソッドをオーバーライドし、 * powerフィールドの値に加えて、itemフィールドのadditionalDamage分を加算した値を返す * itemフィールドのアクセサ */ public static void main(String[] args) { // TODO SuperHeroインスタンスとSlimeインスタンスを作成し、それぞれの名前に"勇者(装備あり)", "スライム"を設定してください // TODO Itemクラスのインスタンスを作成し、("こんぼう", 5)をコンストラクタの引数にしてください // TODO SuperHeroインスンタンスのitemフィールドに作成したitemインスタンスをセットしてください // TODO SuperHeroインスンタンスのattackメソッドを呼び出して、戻り値を出力してください // ※ 15と出力されれば正解

  • C++変数宣言時のコンストラクタについて

    Java開発をこれまでやってきたのですが、 C++を学ぼうとしています。 C++では下記のように宣言した場合hogeは インスタンスになり、Hogeクラスのコンストラクタが呼ばれるようなのですが、 Hoge hoge; Hogeクラスのコンストラクタが下記のような引数を持つものしか定義されていなかった場合は どの様な振る舞いをするのでしょうか? Hoge(int num); Javaでは引数の有るコンストラクタしか宣言しなかった場合はデフォルトコンストラクタは 作られなかったと思うのですが、c++では引数のないデフォルトコンストラクタができてるのでしょうか? また、デフォルトコンストラクタが出来ていなかった場合、 Hoge hoge; というようにプリミティブ型のような変数宣言の仕方で引数有りのコンストラクタを呼ぶことは出来るのでしょうか?

  • javaのことで

    ---MainPanel.java--- import java.awt.Dimension; import java.awt.Graphics; import java.event.MouseEvent; import java.event.MouseListener; import javax.swing.JPanel; import java.util.Random; public class MainPanel extends JPanel implements MouseListener { public static final int WIDTH = 640; public static final int HEIGHT = 480; private static final int NUM_FILE = 4; private File[] file; private int prev; public MainPanel() { setPreferredSize(new Dimension(WIDTH, HEIGHT)); file = new File[NUM_FILE]; for (int i = 0; i < NUM_FILE; i++) { file[i] = new File(i, this); } select(); addMouseListener(this); } private void clear() { for (int i = 0; i < NUM_FILE; i++) { file[i].delete(); } } private boolean check(int a, int b) { return a == b || a == prev || b == prev; } private void select() { Random rand = new Random(); int a, b; do { a = rand.nextInt(NUM_FILE); b = rand.nextInt(NUM_FILE); } while (check(a, b)); file[a].set(0, 0); file[b].set(file[a].getX() + file[a].getWith() + File.SPACE, 0); } public void paintComponent(Graphics g) { super.paintComponent(g); for (int i = 0; i < NUM_FILE; i++) { if (file[i].isSelected()) { file[i].draw(g); } g.drawString("ファイル" + (i + 1) + " … " + file[i].getCnt(), 0, HEIGHT * 3 / 4 + i * 15); } } public void mouseClicked(MouseEvent e) { int x = e.getX(); int y = e.getY(); for (int i = 0; i < NUM_FILE; i++) { if (file[i].isSelected()) { // 表示されていて // 画像内なら if (x > file[i].getX() && x < file[i].getX() + file[i].getWidth() && y < file[i].getY() && y > file[i].getY() + file[i].getHeight()) { file[i].count(); prev = i; clear(); select(); break; } } } repaint(); } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } } フレームを用意してMainPanelを付加し,pack();してください.

専門家に質問してみよう