インスタンス参照でアクセスできない。代わりに型名?

このQ&Aのポイント
  • インスタンス参照でメンバー 'Data.Customer.no' にアクセスできません。代わりに型名を使用してください。
  • static public の配列を持つためには、クラスのメンバとして宣言する必要があります。
  • Dataクラスは一時的にデータを保持するためのクラスであり、インスタンスを作る必要はありません。
回答を見る
  • ベストアンサー

インスタンス参照でアクセスできない。代わりに型名?

画面上に、 名前を入力するTextBoxがひとつと、 顧客情報を入力するDataGridViewがひとつあり、 そのDataGridViewには、連番、名前、メールアドレスの3列, 20行のデータがあります。 この2つのコントロールから入力されたデータをDBに登録したり、 DBから読み込んだ値を表示しようとしています。 (ほかにもいろいろ処理するのですが。) データを一時的に保持しておくクラスを作ろうと考え、 わざわざインスタンスを作るまでもないと思ったので、 staic public なメンバを使用して、 以下のようなクラスを作ってみました。   class Data {    public class Customer    {     static public int no = 0;     static public string name = "";     static public string mailAddr = "";    }    static public string name = "";    static public Customer[] customers = new Customer[20];   } ところが、たとえば、   customers[0].no = 1; のようにしようとすると、   「インスタンス参照でメンバー 'Data.Customer.no' にアクセスできません。代わりに型名を使用してください。」 となります。 どういう意味でしょう? また、どうすれば static public の配列を持てるでしょうか? (そもそもこういうやりかたはしない?) よろしくお願いします。

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

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

   public class Customer    {     static public int no = 0;     static public string name = "";     static public string mailAddr = "";    } と書いたとき、no 等が定義されるのはそのインスタンス(new 等で生成したモノ)ではなくクラスそのものになります。一方、customers 自体はともかくcustomers[0] に入っているモノはインスタンスです。 したがって、そのインスタンスで定義されていない no へのアクセスはできません。 Customer の定義を    public class Customer    {     public int no = 0;     public string name = "";     public string mailAddr = "";    } と変えましょう。 ……でもこの修正をしてもコンパイル時じゃなくって実行時にエラーが出るんじゃないかなぁ?

ogu-ne
質問者

お礼

早速回答をいただきありがとうございます。 なるほど、わかりました。 static の意味がまだよく理解できていなかったということです。 参考になりました。 ところで、このプログラム方は、 回答をいただくまでの間に、このやりかたをやめて、普通のプロパティにしました。 どうもありがとうございました。

関連するQ&A

  • サブクラスで.newInstance()でインスタンス化できない

    以下のようにClass.forNameで取得したクラスをインスタンス化 しようとしていますが、できません サブクラスは.newInstance()でインスタンス化できないのでしょうか? 代替の方法はありますか? ーーーーーーーーーーーーーーーー public class test4121 { public static void main(String[] args) throws Throwable { new test4121(); } public test4121() throws Throwable { //これは実行できるが test4121_2 test = new test4121_2(); //これはできない Class.forName("test4121$test4121_2").newInstance(); } class test4121_2{ } } ーーーーーーーーーーーーーーーー

  • 可変長配列に格納されたオブジェクトの参照

    「name」、「sex」などのデータがあり、 そのデータをHumanオブジェクトとして、可変長配列(humanArray)に格納してあります。 humanArray.add( new Human( name, sex ) );  // このような感じでしょうか。 標準入力から「name」が入力されると、オブジェクトを参照し、 HumanArrayに格納されているHumanオブジェクトの「name」データを一つ一つ比較して、 一致したら配列の要素をすべて出力する。 というプログラムを作りたいのです。 問題としているのは、 一致するかの照合処理を別のクラスで行うので、 nameを処理を行うクラスに渡す必要がありますが、 可変長配列のi番地に入っているオブジェクトのnameを 得るための方法がわかりません。 Humanクラスに public static String throwName() { return name; } のようなクラスを作って、 処理を行うクラスで、 String name = humanArray.get(i).throwCode(); というような処理を行うイメージなのですが・・・。 どのようにすれば良いのかご教授ください。 どのように質問をすれば良いのかも良くわからないので情報が少ないやもしれません その時は遠慮なく「追加情報が欲しい。」と仰ってください。 例 -----配列の内容----- 阿部 男 -------------------- 馬場 女 -------------------- 千葉 女 -------------------- 標準入力:馬場(name) -------Humanクラスの内容-------- class Human { private String name; private String sex; public Human( String nm, String s ) { name = nm; sex = s; } public static void showArticle() { System.out.println(name); System.out.println(sex); } }

    • ベストアンサー
    • Java
  • メンバインスタンスへのアクセス方法

    クラスインスタンスをメンバ変数として保持した時、その保持しているインスタンスのメンバや関数にはどのようにアクセスすればよいのでしょうか。 PHPの文法がまだよくわからないのですが、次のようにやると、エラーになってしまいました。 <?php class Test {  var $member;  public function __construct() {   $member = new Hello();  }  public function test() {   $this->member->world();  } } class Hello {  public function world() {   echo 'hello world';  } } $test = new Test(); // $test->test();はエラーとなってしまう。 $test->test(); ?>

    • ベストアンサー
    • PHP
  • java 一意のIDを振り分けるには。。。

    一意のIDの振り分け方がわかりません。。。 以下のプログラムを改良したいのですが。 CustomerManagerが内部でです。ただCustomerManagerインスタンス毎に一意で構いません。 addCustomerメソッドの整数型引数は除去します。 何卒ご回答よろしくお願い致します。 package exercise12; class CustomerCard { String name; int id; public CustomerCard(int id,String name){ this.name = name; this.id = id; } public String getName(){ return this.name; } } package exercise12; class CustomerManager { public static void main(String[] args){ CustomerManager manager = new CustomerManager(); manager.addCustomerCard(1, "山田一郎"); manager.addCustomerCard(2, "鈴木太郎"); manager.addCustomerCard(3, "田中次郎"); manager.printAllInfo(); } private CustomerCard[] customers = new CustomerCard[4]; private int index = 0; public void addCustomerCard(int id,String name){ customers[index] = new CustomerCard(id,name); index++; } public void printAllInfo() { System.out.print("ID =" + customers[0].id + ","); System.out.println("名前 = " + customers[0].name); System.out.print("ID =" + customers[1].id + ","); System.out.println("名前 = " + customers[1].name); System.out.print("ID =" + customers[2].id + ","); System.out.println("名前 = " + customers[2].name); } }

    • ベストアンサー
    • Java
  • 変数の参照でエラーが出てしまいます。(VB.NET)

    プロシージャの外に記した変数があるのですが、 (Dim IniFileName as string = "myapp.ini")など Public Shared Sub 内でIniFileNameを使おうとすると --------- クラスの明示的なインスタンスを指定しないで、共有メソッドまたは共有メンバ初期化子内からクラスのインスタンス メンバへ参照することはできません。 --------- というエラーが出てしまいます。 クラスの明示的なインスタンスを指定したいのですが、 意味がさっぱり分かりません。 class.IniFileNameとかForm1.IniFileNameなどとしてみたのですが違うようです。 一つ正解をご教示頂けたらと思います。 宜しくお願い致します。

  • 動的に生成されるインスタンス間のやりとりについて

    あるクラスのインスタンスが動的に複数生成される状態で,一つのインスタンスから, 複数の他インスタンスのメンバ関数(仮に関数A)を呼びたいと考えています. そこでstaticなインスタンスのリストのようなものを設けようと考えました. 各インスタンスの関数Aへ関数ポインタの配列を定義し, それによって上記を実現しようと思いました. しかし,インスタンス生成前にインスタンス名を指定して (instance_name_.*p)(); という様に呼べるわけもなく,どう動的にインスタンスのリストを保持するかが思いつきません. 説明が下手ですいません.どなたか教えていただけますでしょうか. よろしくお願いします. 環境 Windows XP, cygwin

  • インスタンス変数について

    JAVA勉強中のものです。 インスタンス変数についてわからないのですが、 class Data{int d;} classSample{ public static void main(String[] args){ Data data1 =new Data(); Data data2 =new Data(); data1.d = 100; data2 = data1; data2.d = 200; System.out.println(data1.d); } } 実行すると200が表示されますが、new演算子によってできたオブジェクトの実体を参照する ID がdata1およびdata2に入るのは理解できるのですが、 インスタンス変数のdはメモリ上でどう設定されているかイメージがわきません。 わかる方どうぞ教えて下さい。

    • ベストアンサー
    • 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(){ } }

  • Java 静的メソッドとインスタンスメソッド

    静的メソッドとインスタンスメソッドの使い分けがよくわかりません。 私の認識は 静的メソッド:インスタンスメンバ変数を参照する必要がない処理 インスタンスメソッド:インスタンスメンバ変数を参照して行う処理 と思っています。 よって、例えばDAOを作成する場合、select、update、insertを実行するメソッドを作成しますが、これらはクラスのインスタンスメンバ変数を参照する必要がないので静的メソッドにするべきだと思っています。 しかし、本やネットのDAOのサンプルプログラムはインスタンスメソッドで作成されています。 これらは、private static String の変数(SQL文が記述されている)を参照していますが、インスタンスメンバ変数は参照していません。 なぜselect、update、insertのメソッドをインスタンスメソッドにする必要があるのかわかりません。 静的メソッドとインスタンスメソッドの使い分けの基準を教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java
  • Java 型指定を伴わないインスタンスの作成?

    問題集で以下のプログラム(一部)を見かけました。 class Test{ public static void main(String args[]){ new Animal("A"); } } Animalクラスのインスタンスを作成しているということなのですが、 これまでであれば、 Animal a = new Animal(); というようにイコールの左で インスタンスの型と変数を指定する形で学んで来ました。 型や変数を指定しないでインスタンスの作成をすることが できるのですか? 回答をお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう