
初めまして、お世話になります。JAVAの入門者です。継承のところまで進みましたが、代入と配列のクラス化で困っています。
環境は、Windows7 professional、JDK1.6.0_33、エディターはnotepad++ないしEclipse4.2です。プログラムは以下のとおりです:
class PersonalData{ //継承元クラス
String name;
String phoneNumber;
public String getContact(){
return name + "の連絡は" + phoneNumber + "に電話です";
}
}
class MailPersonalData extends PersonalData{ //派生クラス
String mailAddress; //問題となっているフィールド
public String getContact(){ //オーバーライド
return name + "の連絡は" + mailAddress + "にメールです";
}
}
public class Main{ //実行クラス
public static void main(String[] args){
PersonalData[] pdArray = new PersonalData[100];
MailPersonalData mpd = new MailPersonalData();
PersonalData pd = new PersonalData();
pdArray[0] = mpd; //代入
pdArray[1] = pd;
pdArray[0].name = "ジョン";
pdArray[0].mailAddress = "xx@xxxx"; //ここでエラー発生
pdArray[1].name = "ポール";
pdArray[1].phoneNumber = "012-345-6789";
System.out.println(pdArray[0].getContact());
System.out.println(pdArray[1].getContact());
}
}
というプログラムを作りましたが、コマンドプロンプトによるコンパイル時に
Main.java27:シンボルが見つけられません
シンボル:変数 mailAddress
場所:PersonalDataのクラス
pdArray[0].mailAddress="xx@xxxx"
^ (^は.の直下にあります)
とエラーが出てしまいます。Eclipse4.2では「解決できないか、フィールドではありません」と表示されます。
プログラム23行目のpdArray[0] = mpd; の代入によりpdArray[0]を派生クラス型にしましたが、派生クラス内のフィールドmailAddressがmainでは認識されていないようです。継承元クラスに記述されているphoneNumberはフィールドとして認識されています。
配列ではなくpd0、pd1といった個別のクラス型変数を作成した場合はmailAddressもフィールドとして認識され期待している結果が得られました。期待している結果は次のとおりです:
ジョンの連絡はxx@xxxxにメールです
ポールの連絡は012-345-6789に電話です
教えて!gooに似た質問がありましが、少し違うようです。(http://oshiete.goo.ne.jp/qa/1201607.html)
その他、googleでキーワードに配列のクラス化、継承、オーバーライドなどを用いて検索しましたが解決法は得られませんでした。
なにぶん初心者の為、非常に的外れなことをやっていると思い誠に恐縮ですが、どうかご容赦ください。御教授のほど何卒宜しくお願い申し上げます。
No.1ベストアンサー
- 回答日時:
配列を宣言したとき、その要素へのアクセスは宣言された型(この場合はPersonalData型)を使用することになります。
したがって、PersonalDataにないフィールドやメソッドにアクセスすることはできません。アクセス時の対処法は、……あることはありますが初心者は使わないほうがいい手法なので教えません。
# それに頼ることを覚えるとその便利さゆえにオブジェクト指向を身につけられなくなる悪魔の手法ですので
それよりも、
MailPersonalData mpd = new MailPersonalData();
mpd.name = "ジョン";
mpd.mailAddress = "xx@xxxx";
pdArray[0] = mpd;
PersonalData pd = new PersonalData();
pd.name = "ポール";
pd.phoneNumber = "012-345-6789";
pdArray[1] = pd;
というふうに配列への代入の前に値を設定しておきましょう。
迅速でかつ分かりやすい回答をありがとうございます!(涙
現在使用しているテキストを見返してみると、「コンパイラは変数の型しか見ず、実際に変数に入っているインスタンスの型が何であるかはチェックしない」と記述されていました。その意味が初めて分かりました。これでまた前進できます。
しかし、ちょっとした疑問が生じてしまいました...。mpdもpdも代入できる配列pdArrayは、継承元クラスであるPersonalData型で宣言するしかないのでしょうか?それとも、もっと別なスマートな配列宣言の方法があるのでしょうか?
重ね重ね初歩的な疑問で恐縮です。もし宜しければ御教授下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java final 1 2022/06/10 22:49
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- C言語・C++・C# クラスのメンバ変数を基準に並べ替えをしたい 5 2022/12/25 17:40
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンボボックスのマウスホイー...
-
どこからも呼ばれていない無意...
-
Cstring(日本語含む)をcharに...
-
「囲うインスタンス」のエラー...
-
IPアドレスについて クラスA?...
-
3年間同じクラスになる確率
-
java eclipse 型に解決できません
-
エクセルのデータ振り分け方法...
-
共通で使う関数を集めたクラス...
-
イトマンスイミング、ベビーク...
-
標準モジュールとクラスモジュ...
-
javaで画像ファイルの入出力方法
-
プロパティのアクセス修飾子
-
JSPからJavaクラスを参照できな...
-
私はクラスLINEにまだ入れてな...
-
変数の継承について
-
ページ遷移時にアコーディオン...
-
ラッパークラスってインヘリタ...
-
COMオブジェクトの参照カウント...
-
String または byte[]を16進に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列の重複する値とその個数を...
-
どこからも呼ばれていない無意...
-
java eclipse 型に解決できません
-
共通で使う関数を集めたクラス...
-
IPアドレスの3バイト目の呼び方
-
同じクラスにならない確率を教...
-
同一パッケージにあるクラスが...
-
同じパッケージ、クラス名が含...
-
重複エラーを解決するには
-
コンボボックスのマウスホイー...
-
EclipseでJSPのコンパイルエラー
-
tomcat上でのpropertiesファイ...
-
Cstring(日本語含む)をcharに...
-
main()を持つクラスが2つ以上...
-
dllと同じプロジェクトにする方法
-
UMLのクラス図はmain()も含むん...
-
正規表現を使った小数入力チェ...
-
VBAもしくはVB6:クラスの中で...
-
3年間同じクラスになる確率
-
Java「デフォルトのパッケージ...
おすすめ情報