• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:クラス型配列が派生クラス内フィールドを認識しません)

クラス型配列が派生クラス内フィールドを認識しません

このQ&Aのポイント
  • クラス型配列が派生クラス内のフィールドを認識しないエラーが発生しています。
  • プログラムにおいて、PersonalDataクラスを継承したMailPersonalDataクラスにはmailAddressというフィールドが存在します。
  • しかし、派生クラス型の配列pdArray内において、mailAddressフィールドを参照する際にエラーが発生しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答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; というふうに配列への代入の前に値を設定しておきましょう。

capy3
質問者

お礼

迅速でかつ分かりやすい回答をありがとうございます!(涙 現在使用しているテキストを見返してみると、「コンパイラは変数の型しか見ず、実際に変数に入っているインスタンスの型が何であるかはチェックしない」と記述されていました。その意味が初めて分かりました。これでまた前進できます。 しかし、ちょっとした疑問が生じてしまいました...。mpdもpdも代入できる配列pdArrayは、継承元クラスであるPersonalData型で宣言するしかないのでしょうか?それとも、もっと別なスマートな配列宣言の方法があるのでしょうか? 重ね重ね初歩的な疑問で恐縮です。もし宜しければ御教授下さい。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

PersonalData ってクラスに mailAddress ってメンバー, あるの?

capy3
質問者

お礼

早速のご回答、ありがとうございます。PersonalDataクラスにはmailAddressというメンバーはありませんでした。クラスの宣言と継承の理解が不十分でした。今回の件で勉強になり、誠にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 基本クラスポインタ = new 派生クラス[i];

    基本クラスのポインタ変数pbaseを宣言し、new演算子にて派生クラスの配列を動的に確保して、pbaseに代入した場合、delete[] pbaseは上手く動作するのでしょうか。 (Aのデストラクタは仮想関数にしてあるとしておきます) ------ex-start------ class A {}; class b:public A{}; main() {   A * pbase   pbase = new B[5];   delete[] pbase } ------ex-end------ 例えば、 class Aは12バイト class Bは20バイト である場合、配列のサイズが違うのに、delete[]でちゃんと開放されるのでしょうか。 それともnew/deleteは確保したサイズをシンボル毎に記憶しているのでしょうか。 どうもこの辺が曖昧で実装する時にあやふやになってしまいます。どなたかお知恵をお貸しくださいませ。

  • クラス同士を配列化するこはできますか?

    調べてもそれらしきサンプル載っていなかったので質問します。 使用言語はjavaSE6です 例えばこんな感じです class A{ int a=0; } class B{ int b=1; } class C{ int c=2; } class sample{ public static void main(String[] args){ //クラスA、クラスB、クラスCを配列にするやりかたわからないのでここまで } } 宜しくお願いします。

    • ベストアンサー
    • Java
  • 親クラスと子クラスのフィールドとメソッドについて

    親クラスと子クラスのフィールドとメソッドについて 以下のサンプルソースを実行した時の動作の原理について 教えてください。 oya型変数にkoクラスのインスタンスを作成した場合、 メソッドはkoクラスのものなのに、 フィールドはoyaクラスのものになるということが イマイチすっきり理解できません。 どういうことなんでしょうか。 ------------------------------------------------------- [ソース] public class exec { public static void main( String args[]){ oya obj = new ko(); System.out.println(obj.str_field); obj.disp_field(); } } public class oya{ String str_field="親実行"; public void disp_field(){ System.out.println(str_field); } } public class ko extends oya { String str_field = "子実行"; public void disp_field(){ System.out.println(str_field); } } ------------------------------------------------------- [実行結果] > 親実行 > 子実行 -------------------------------------------------------

    • ベストアンサー
    • Java
  • 配列クラスのクラス名

    配列クラスのクラス名 配列クラスのクラス名を教えてください。 配列はクラスですよね。そこまでは分かります。 こんなコードを実行しましたが System.out.println((new int[0]).getClass()); System.out.println((new boolean[0]).getClass()); System.out.println((new String[0]).getClass()); System.out.println((new Integer[0]).getClass()); 親切にこのような結果を出力してくれます。 class [I class [Z class [Ljava.lang.String; class [Ljava.lang.Integer; 結果として配列が何というクラスなのかは分かりません。 (もしかして『[I』『[Z』『[L』という名前のクラスでしょうか?) 昔Javaのソースを読んだときに、配列クラスのファイルも 読んだことがあるような気がするのですが、 なんと言うクラスだったか忘れてしまいました。 パッケージ名+クラス名を教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 初期値を持ったクラスの配列を使うには?

    C、C++の経験はけっこう長いのですが、javaは初心者です。 初期値を持ったクラスの配列はC++だとたとえば、 class User { char * name; int user_id; }; と宣言しておいて、 User user[] = { {"moritan2", 12345}, {"moritan3", 56789}, }; と書けますよね。これをjavaでやるにはどうすればいいのでしょうか? javaで class User { String name; int user_id; }; と宣言しておいて、 User user[] = { {"moritan2", 12345}, {"moritan3", 56789}, }; とやってもコンパイル時にエラーになってしまいます。

    • ベストアンサー
    • Java
  • C# クラスの配列の並び替えについて

    お世話になります。 VC#2010にて、 class A { int id; string name; int price; int categoly; } 上記のようなクラスの配列、ここではA[] Asとしますが、 この配列にnameやprice,categolyがバラバラの データが入っているものとした場合、 第一条件でcategoly、第二条件でprice, 最後にnameの順で並び替える方法を教えてください。 SQLだと、SELECT * FROM As ORDER BY categoly,price,name のような結果に並び替えます。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • 派生クラスをリストする

    Stringであらわせる独自のデータ形式がいくつかあり、次のようにして、 abstract class DataType{ //このファイル形式かどうかを判定する abstract boolean isThisDataType(String s); } class DataTypeA extends DataType{ boolean isThisDataType(String s){...} } class DataTypeB extends DataType{ boolean isThisDataType(String s){...} } class ManagerOfDataType{ DataType[] getAllSupportedDataTypes(){...} //サポートしているすべてのデータ形式を取得 DataType FindBestDataType(String s){ for(i=0;i<getAllSupportedDateTypes().length();i++){ if(getAllSupportedDataTypes()[i].isThisDataType(s)){ return getAllSupportedDataTypes()[i]; } } } } のようにして、どのデータ形式でも対応できるようにしたいと思っているのですが、わからないのは、「サポートしているすべてのデータ形式を取得」、すなわち、DataTypeの派生クラスをすべて取得するところです。 DataTypeA,BのコンストラクタでstaticなListに自分のクラス名を登録していくなどの方法も思いついたのですが、それでは、DataTypeA,Bのインスタンスを生成したときしか登録が実行されませんよね?宣言すると同時に、登録が実行されるような方法はありますでしょうか? もっとスマートなデザインパターンがあるぞ、という話でも、お教えくだされば幸いです。

    • ベストアンサー
    • Java
  • クラスについての質問です!!

    本に下のような説明があったのですが、ここで出てくる「メンバ」という言葉がわかりません。 これはどういう意味合いなのでしょうか? よろしくお願いします。 ――――――――――――――――――――――――――― public class JsMsg1{ public static void main (String args[ ]) { ・・・ } } というプログラムはJsMsgというクラスがあり、メンバとしてmain()メソッドがあり、フィールドはないというクラス構成をしています。

    • ベストアンサー
    • Java
  • クラスとインスタンスについて

    入社1年目のプログラミング経験0のSEです! Javaのクラスとインスタンスについてぜんぜん理解できません! 下のソースをどうしたらいいのかわからないです。 import java.io.*; class SumAndAvgMain{ public static void main(String argv[]){ BufferedReader r = new BufferedReader(new InputStreamReader(System.in),1); try{ //3教科の得点を入力しintに変換 //SumAndAvgクラスのインスタンスを作成 //合計点及び平均点を出力する。 }catch(IOException e){ System.out.println("例外発生"+e); } } } class SunAudAvg{ public static void main(String args[]){ //各教科の得点用のフィールド int kokugo; int suugaku; int eigo; //SumAndAvgクラスのコンストラクタ SumAndAvg(int kokugo,int suugaku,int eigo){ //フィールドに国語の点数を代入 //フィールドに数学の点数を代入 //フィールドに英語の点数を代入 } //3教科の合計点を求める int getGoukei(){ } //3教科の平均点を求める double getHeikin(){ } }

  • ArrayクラスとtoStringについて

    問題集で次のプログラムを見掛ました。 public class Main{  public static void main(String args[]){   int[] array = new int[0];   System.out.println(array);  } } これを実行するとprintlnメソッドで toStringメソッドが呼び出されますが、 ArrayクラスはObjectクラスを継承しているため、 toStringメソッドもObjectクラスから継承されているので、 結果として、配列の要素数が0であっても、 エラー等が発生せずハッシュコードが表示される、ということです。 ObjectクラスのtoStringメソッドが ハッシュコードを返すものであるのは理解できます。 でも、なぜ要素数が1以上で何かしらの要素が存在する場合は、 ハッシュコードが返らないのでしょうか? 詳しい方、解説をお願いします。