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

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

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

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

Java

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

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

1664閲覧

初歩的な継承に関して。

beginner_7

総合スコア14

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

Java

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

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2019/10/05 08:57

java学習初学者です。

現在サブクラスであるDogクラスに、スーパークラスであるAnimalクラスを継承して、
実行結果に「①ポチは走りました ②ポチは食事しました」と出力したいのですが、
結果としては、「①nullは走りました ②nullは食事しました」と出力されます。

自分なりに試行錯誤してみましたがどこが間違っているのかが分かりません。
初歩的な内容で申し訳ありませんが、何卒お力添えの程よろしくお願いいたします。

**[①Main クラス]** public class Main { public static void main(String[] args) { // commonパッケージのCatクラスをインスンタンス化 Dog dog = new Dog(); // Dog型インスタンスのnameフィールドに ポチ を代入 dog.name = "ポチ"; // Dog型インスタンスのrunメソッドを実行 // ※ ポチは走りました。が表示されれば正解 dog.run(); // Dog型インスタンスのeatメソッドを実行してください // ※ ポチは食事をしました。が表示されれば正解 dog.eat(); } } **[②Dog クラス]** package common; // 同一パッケージのAnimalクラスを継承 public class Dog extends Animal{ public String name ; } **[③Animal クラス]** package common; public class Animal { public String name; public void run() { System.out.println(this.name + "は走りました。"); } public void eat() { System.out.println(this.name + "は食事をしました。"); } public void setName(String name) { this.name = name; } public String getName() { return this.name; } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

Dogクラスのnameフィールドと、Animalクラスのそれが共存しているのが問題です。
Dogクラスの実装は次のように空で充分でしょう。

Java

1public Dog extends Animal { 2}

Dogクラスは本当に必要なのか、nameフィールドはpublicで良いのか、etc...
いくつか不思議な点がありますが、教材の狙いが分からないので取り扱わないことにします。

投稿2019/10/05 09:02

編集2019/10/05 09:03
LouiS0616

総合スコア35658

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

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

beginner_7

2019/10/05 09:12

迅速なご回答ありがとうございます! ご回答内容を踏まえ、Dogクラスからフィールドを消し、nameの修飾子をprivateに、Mainの方でdog.setName("ポチ"); としたところうまくいきました。本当にありがとうございました! 参考までにお伺いさせていただきたいのですが、Animalクラスのフィールドnameの修飾子がprivateでなければならない理由はなんでしょうか? アクセサをしようしているからでしょうか? 何卒よろしくお願いいたします。
LouiS0616

2019/10/05 09:21 編集

> Animalクラスのフィールドnameの修飾子がprivateでなければならない理由はなんでしょうか? アクセサをしようしているからでしょうか? 主従が逆転しています。 x アクセサを使用するからフィールドをprivateにする o フィールドをprivateにするからアクセサが使用される オブジェクト指向プログラミングの原則の一つにカプセル化があります。 Javaの立場を踏まえてざっくり言うと、『フィールドの値を意識せずにオブジェクトを適切に操作できる』ようにするのがカプセル化です。 その観点では、フィールドを外部から好き放題いじれるのは好ましくないのです。 最近関連する議論がありました。参考にどうぞ。 https://teratail.com/questions/214364
LouiS0616

2019/10/05 09:21

動物の名前を変更することを想定しないのであれば、setNameは用意せずコンストラクタで名前を受け取るようにすれば良いです。
beginner_7

2019/10/05 13:46

詳しくありがとうございます! 無事に解決致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問