前提
現在Javaの学習を始めて二週間ほどになります。
以下のブログに掲載されていたオブジェクト指向の問題(基本問題2-13)を解いており、
回答とは別の方法で実行できないかと試している際にエラーが発生してしまいました。
一つ前の問題(基本問題2-12)で子クラスのコンストラクタからsuper()で親クラスである抽象クラスのコンストラクタへ引数を渡して親クラスのprivate変数にアクセス?する方法を知りました。
基本問題2-13
基本問題2-12
今回の問題で与えられたコードでは親クラスのフィールド変数がprotectだったので、privateに変更し、上記の方法でprivate name変数へ値を渡せないかと試したところエラーが発生しました。
実行結果は自己紹介までは進みますが、runメソッド、swimメソッドの結果は表示されませんでした。
実行環境はEclipseです。
実現したいこと
エラーの原因の解明
Athleteクラスの選手名をprivate String nameにした場合どのようにアクセスするのが最適か知りたい。
発生している問題・エラーメッセージ
エラーメッセージ(↓実行結果です) 私の名前は北島光一、水泳の選手です。 私の名前は高橋昭子、マラソンの選手です。 私の名前は岩崎正子、水泳の選手です。 私の名前は野口みきえ、マラソンの選手です。 Exception in thread "main" java.lang.Error: Unresolved compilation problem: フィールド Athlete.name は不可視です at aa.Swimmer.swim(AbstractCastPractice.java:99) at aa.AbstractCastPractice.main(AbstractCastPractice.java:62)
該当のソースコード
public class AbstractCastPractice { public static void main(String[] args) { // アスリート配列オブジェクトの生成 Athlete[] athlete = { new Swimmer("北島光一"), new MarathonRunner("高橋昭子"), new Swimmer("岩崎正子"), new MarathonRunner("野口みきえ") }; // 自己紹介 for(int i = 0; i < athlete.length; i++) { System.out.println(athlete[i]); } System.out.println(); // アスリートの種目に応じたメソッドの実行 for(int i = 0; i < athlete.length; i++) { if(athlete[i] instanceof Swimmer) { ((Swimmer)athlete[i]).swim(); }else if(athlete[i] instanceof MarathonRunner) { ((MarathonRunner)athlete[i]).run(); } else { System.out.println("unkown"); } } } } // Athlete抽象クラス abstract class Athlete { // 選手名 private String name;// 元のコード→protected String name; public Athlete(String name) { // this.name = name; //Athleteクラスにコンストラクタを追加しました } // // 種目名取得メソッド(抽象メソッド) public abstract String getType(); @Override public String toString() { return "私の名前は" + name + "、" + getType() + "の選手です。"; } } class Swimmer extends Athlete{ public static final String TYPE = "水泳"; public Swimmer(String name) { super(name); //元のコード→this.name = name; } public String getType() { return TYPE; } public void swim() { System.out.println(name + "は泳ぎました"); } } class MarathonRunner extends Athlete{ public static final String TYPE = "マラソン"; public MarathonRunner(String name) { super(name); //元のコード→this.name = name; } public String getType() { return TYPE; } public void run() { System.out.println(name + "は走りました"); } }
試したこと
エラーメッセージの検索
コンストラクタ、継承、抽象クラス、アクセス修飾子などの再学習
補足情報(FW/ツールのバージョンなど)
Eclipse
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/11/18 08:38
2022/11/18 08:50