プロが教えるわが家の防犯対策術!

こんにちは。
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回しかないため)何かよい方法はないでしょうか?
よろしくおねがいします。

A 回答 (3件)

コンストラクタの名前(PlaceRectangle)とクラス名(PlacedRectangle)が一致していないからです。


一致していないので、コンストラクタではなくPlaceRectangleという名前のメソッドだと解釈されていて、戻り値がないと怒られています。

x軸y軸の表示は・・・
私なら、PlacedRectangleにgetX():int, getY():intを作り、
Ex70側で
System.out.println("位置は(1" + r1.getX() + "," + r1.getY() + ")です。")
とします。

あるいは位置を表示するだけのshowLocation()のようなものをPlacedRectangleに作るか

この回答への補足

ご回答ありがとうございます。
プログラムはこんな感じになったのですが
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と表示されるばかりで
思うような結果が得られません。
どなたかアドバイスをお願いいたします。

補足日時:2007/09/07 15:43
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/09/07 17:42

mainメソッド内をもう一度チェックしてみましょう。



# これくらい自分で気づけないとダメです。
# コピー&ペーストでソースを作ることが危険なことを理解しましょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/09/07 17:34

>コンストラクタで値を設定しているのになぜ再設定(位置のセット、


>大きさのセット)する必要があるのか分かりません。

「再設定」ですか?たぶん問題文を読み間違えたのかな?
コンストラクタの中でのセットの仕方を言っているのだと思いますよ?


>いづれのコンストラクタも
>位置のセットは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;
}

大きさの設定はちょっと自分で考えてみてください。
スーパークラスのコンストラクタを呼ぶというところを正しく理解することがこの課題のキモだと思いますので。


#しかし、ものすごい勢いで課題をこなしてますねえ(笑)

この回答への補足

ご丁寧に解説頂きありがとうございます。
プログラムが完成したかと思ったのですがコンパイルエラーが起きてしまったみたいです。
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軸の表示を行っても大丈夫でしょうか
どなたかよろしくお願いします。

補足日時:2007/09/07 00:45
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!