質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

798閲覧

Javaの継承について、superに動作がよくわからない件

ogiogimaru

総合スコア39

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/05/14 13:28

現在Javaの継承の練習中なのですが、途中でエラーが発生してしまいました。作っていたプログラムは、Rectangleクラスで長方形の、Boxクラスで直方体の辺の合計の長さと各辺の長さをそれぞれ出力するというものです。

そこで、 super というのを使っていたのですが、うまく機能してくれず理由もさっぱりわかりません。

エラーは以下の通りです。

Inherited.java:20: エラー: スーパータイプのコンストラクタの呼出し前はwidthを参照できません
super(width, height);
^
Inherited.java:20: エラー: スーパータイプのコンストラクタの呼出し前はheightを参照できません
super(width, height);

コードは以下の通りです。

class Rectangle{ int width, height; int r_perimeter; Rectangle(int x, int y){ width = x; height = y; } int cul_1(){ r_perimeter = width*2 + height*2; return r_perimeter; } } class Box extends Rectangle{ int length; Box(int z){ super(width, height); length = z; } int cul_2(){ int b_perimeter = cul_1()*2 + length*4; return b_perimeter; } } class TestObjects{ Rectangle rec = new Rectangle(5,4); Box box = new Box(4); } public class Inherited{ public static void main(String[] args){ TestObjects test = new TestObjects(); System.out.println("Rectangle: width = "+test.rec.width+", height = "+test.rec.height+", perimeter = "+test.rec.cul_1()); System.out.println("Box: width = "+test.box.width+", height = "+test.box.height+", length = "+test.box.length+", perimeter = "+test.box.cul_2()); } }

Javaを学習し始めてまだ少ししかたってないのでわからないことだらけです。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/05/14 13:41

できれば、コードブロックはファイル別にしてもらえると、見やすいです。
guest

回答2

0

では、このコードが動くと思いますか?

java

1int x = x;

投稿2020/05/14 14:09

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Rectangle rec = new Rectangle(5,4);
Box box = new Box(4);

rec はRectangleを直接インスタンス化したもので、
Boxが継承しているRectangleとは別物だからです。

Boxのコンストラクタから直接値を送ってあげる必要があると思います。


つまりこういうこと

java

1public class Box extends Rectangle{ 2 int length; 3 4 Box(int z,int w,int h){ 5 super(w, h); 6 length = z; 7 } 8 9 int cul_2(){ 10 int b_perimeter = cul_1()*2 + length*4; 11 return b_perimeter; 12 } 13} 14

java

1public class TestObjects { 2 Rectangle rec = new Rectangle(5,4); 3 Box box; 4 TestObjects(){ 5 box = new Box(4,rec.width,rec.height); 6 } 7}

RectangleはRectangleで別で持っておきたいならこうするしかないですね。

投稿2020/05/14 13:32

編集2020/05/14 14:16
m.ts10806

総合スコア80861

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ogiogimaru

2020/05/14 13:43

今回の継承の場合、レクタングルのクラスの変数であるwidthやheightをそのまま使えないのですか?
maisumakun

2020/05/14 13:51

エラーメッセージにも「スーパータイプのコンストラクタの呼出し前はheightを参照できません」と明記してあります。
m.ts10806

2020/05/14 13:52

えっと、クラス名や変数名はカタカナにせずそのまま書いてもらえませんか? 今回のエラーって、Boxをnewしているところで起きているはずなので、そこをなんとかする必要があります。 正直なところどういう設計思想でこの構成になっているのか、意図が分からないので何とも言えませんが。
m.ts10806

2020/05/14 14:31

本当に理解できたうえでの解決なのか、ものすごーーーく不安 https://teratail.com/help/question-tips#questionTips4-2 想定の動作するのか知らないですし、そもそもの設計思想をきちんと聞いてなくて私の解釈で勝手に「とりあえず動くようにしただけのコード」ですからね。 もっとケースパターン必要でしょう。
ogiogimaru

2020/05/15 11:53

今のところ、recの時はRectangleのコピーをしている状態、そのコピーの変数を変化させても本物には影響はなく、Boxを呼び出したときには継承しているのは本物のRectangle、そのRectangleの変数にはまだ値は入っていない。ということで理解しています。 この理解で正しいでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問