こんにちは。
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回しかないため)何かよい方法はないでしょうか?
よろしくおねがいします。
No.2ベストアンサー
- 回答日時:
コンストラクタの名前(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と表示されるばかりで
思うような結果が得られません。
どなたかアドバイスをお願いいたします。
ご回答ありがとうございました。
エラーメッセージが「戻り値の型が必要です」
という表示があったのでそっちばかりに気がいってしまって
コンストラクタとクラス名の記述には
気が回っていませんでした・・・
x,y軸の表示は専用のメソッドを作り、見やすくなりました。
ありがとうございました^^
No.3
- 回答日時:
mainメソッド内をもう一度チェックしてみましょう。
# これくらい自分で気づけないとダメです。
# コピー&ペーストでソースを作ることが危険なことを理解しましょう。
私の補足にお気づきありがとうございます。
次回からはコピペする際はただやみ雲にするのではなく
ちゃんと意味を把握しながら行っていきたいと思います。
ご回答ありがとうございました^^
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;
}
大きさの設定はちょっと自分で考えてみてください。
スーパークラスのコンストラクタを呼ぶというところを正しく理解することがこの課題のキモだと思いますので。
#しかし、ものすごい勢いで課題をこなしてますねえ(笑)
この回答への補足
ご丁寧に解説頂きありがとうございます。
プログラムが完成したかと思ったのですがコンパイルエラーが起きてしまったみたいです。
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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++からC#のdllを参照する際、...
-
DataSet(DataTable)の使い方
-
「配列定数は、イニシャライザ...
-
【C#】フォームをなめらかに移動
-
javaでcsvファイル読込時の改行...
-
JUnit4のアノテーションについて
-
intが負の時に投げる例外はあり...
-
式の型は配列型で int に解決済...
-
c# デリゲート関連の命名について
-
Java画像表示など
-
JTableのセルの背景色について
-
[c++]メンバ配列での要素数省略
-
SwingでJtableのヘッダ行が表示...
-
javaのプログラムで、forの文が...
-
6桁の数字を重複なしでランダム...
-
書式で分からないところがある...
-
Path型をString型へ変換する(Java)
-
JSPやサーブレットでSystem.out...
-
Java配列でNullPointerExceptio...
-
System.err. printlnとSystem.o...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「配列定数は、イニシャライザ...
-
java spring でエラーが出て困...
-
Java 初心者 int型の取り扱い方
-
式の型は配列型で int に解決済...
-
DataSet(DataTable)の使い方
-
C#で、デリゲートからその関数...
-
6桁の数字を重複なしでランダム...
-
C#で実行時にメソッドの返り値...
-
JUnit4のアノテーションについて
-
行の途中から読み込む方法
-
Javaで電卓を作りたい
-
SwingでJtableのヘッダ行が表示...
-
javaでcsvファイル読込時の改行...
-
javaでカレンダー作成
-
ビープ音をなめらかに鳴らしたい
-
c# デリゲート関連の命名について
-
intが負の時に投げる例外はあり...
-
java 長さの異なる配列の代入
-
デスクトップのアイコンの位置...
-
【C#】フォームをなめらかに移動
おすすめ情報