• ベストアンサー

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

covachanの回答

  • covachan
  • ベストアンサー率38% (46/120)
回答No.3

こんにちは >Humanクラスに >public static String throwName() >{ > return name; >} Humanクラスは値を保持するビーンクラスですよね? であるならば複数のHumanオブジェクトが生成されるのに その中の値へのアクセスメソッドがstaticなのは問題ではないですか? ここは#2さんが仰るようにstaticを外すべきです。 それと、メソッド名もgetNameのように書くと慣例に沿っていてベターだと思います。 きっと既にコーディングをされて動作が期待通りでない上での質問だと思われますが、 staticの意味、目的なりを把握されればきっと問題点が見えてくると思います。

noname#17462
質問者

お礼

ご回答ありがとうございます。 throwNameメソッドにstaticを付けていた事については、 今まではstaticを付けてメソッドを道具として利用するのみだったので、 そのまま付けてしまいました。 また、メソッド名に関しても、 フィールドを返すメソッドは「get+フィールド」 と命名する事を知りましたので、 HumanクラスのthrowNameメソッドは public String getName(){ return name; } と修正しました。 また、Humanクラスに public String getHumanObj(){ String human = "" + name + " " + sex; return human; } というメソッドを追加しました。 データを得る際の実際のコードは String name = "馬場"; for( int i=0; i<humanArray.size(); i++){ Human human = new humanArray.get(i); nm = human.getName(); if( name.equals( nm ) ){ humanObj = human.getHumanObj(); System.out.println( humanObj ); } } とする事で、humanArrayの1番地に入っているオブジェクトの要素である 「馬場 女」を出力する事ができました。 (完成したコードを見ずに、改めて書いているのでコードを間違えているかもしれませんが。) ご回答くださった皆様に改めてお礼申し上げます。 ありがとうございました。

関連するQ&A

  • オブジェクトのフィールドのコピーについて

    下記で作成したプログラムで、Humanクラスの別のオブジェクトの各フィールドの内容を自身のオブジェクトの各フィールドにコピーするpublicメソッドのcopyDataで、「Humanクラスの別のオブジェクトの各フィールドの内容を自身のオブジェクトの各フィールドにコピーする」するプログラムが分かりません。むしろ、知らなくて、もしよければどのようなプログラムになるのか教えてください。 class Human { private double height, weight; private String name; public Human() { height = 0; weight = 0; name = "noname"; } public void inputData(String na, double ht, double wt) { name = na; height = ht; weight = wt; } public void showValue() { System.out.println("名前: " + name + ", 身長: " + height + "cm, 体重:"+ weight + "kg"); } public void copyData(Human a) { } } class KNO1 { public static void main(String args[]) { Human member1,member2,member3; System.out.println("member1:"); member1 = new Human(); member1.inputData("Taro",165.0,55.0); menber1.showValue(); System.out.println("member2:"); menber2 = new Human(); member2 = member1; member2.showValue(); System.out.println("member3:"); member3 = new Human(); member3.copyData(menber1); member3.showValue(); member1.inputData("Hana",175.0,75.0); System.out.println("member1:"); member1.showValue(); System.out.println("member2:"); member2.showValue(); System.out.println("member3:"); member3.showValue(); } }

    • ベストアンサー
    • Java
  • C#で構造体配列

    C#で構造体配列の操作練習?をしているのですが using System; using System.Collections.Generic; using System.Text; namespace test1 { public struct Data { public string name; // 名前 public uint value; // 値 } class read { Data[] human = new Data[300]; public static string idSearch() { for (int i = 0; i < 300; i++) { if (test1.read.human[i].value == 25) return test1.read.human[i].name; } } } } だと エラー CS0120: 静的でないフィールド、メソッド、またはプロパティ 'test1.read.human' で、オブジェクト参照が必要です。 と言うエラーが出るのですが、どうしてでしょうか?

  • あるclassのオブジェクトをVectorで作るには

    以下のプログラムのようにあるクラスを定義してそのクラスの オブジェクトを配列として作成する方法は知ってるんですが、 Vectorとして作成するにはどうしたらいいですか? public class Test {  public static void main(String[] args) {   Book book[] = Book[5];   book[0] = new Book("English");  } } class Book{  String name;  Book(String name){   this.name = name; } }

    • ベストアンサー
    • Java
  • 連想配列、オブジェクト配列の使い分け

    お世話になります。 データベースで結果を取得する場合など、連想配列のままではなく何故、わざわざオブジェクトに格納する様な手法が使われるのでしょうか? 連想配列のままで処理するほうが早いと思いますし、それに付随するクラスファイルも多くなります。また、「結びつきを緩くして仕様変更に耐えうる様に」など聞きますが、余計複雑になってしまう様な気がしますので、メリットが今ひとつ分からず判断に迷ってしまいます。 どの様な使い分け、考え方をすれば良いかアドバイスいただけたら幸いです。 何卒、宜しくお願いします。 例) ※必要と思われる部分のみ記述しております。 ■連想配列 while($row=mysql_fetch_assoc($res)){ ~以下必要な処理} ■オブジェクト配列 while($row=mysql_fetch_assoc($res)){ $example = new Example(); $example->setName($row['name']); $example->setAddr($row['addr']); $array[] = $example } ~以下必要な処理 ○モデル class Example { private $_name = null; private $_addr = null; public function __construct() {} public function setName($name) { $this->_name = (string) $name; return $this; } public function getName() { return $this->_name; } public function setAddr($addr) { $this->_addr = (string) $addr; } ~以下省略 }

    • ベストアンサー
    • PHP
  • jdk1.5.0_11を使って

    参考書の通りにサクラエディタにフィールドのみのHumanクラス public class Human{ String name; } を作り、 もう一つ、 public class UseHuman{ public static void main(String args[ ]){ Human.taro = new Human(); taro.name = "太郎"; System.out.println("taro.name);} } として、コンパイルして実行すると、taro.nameと出てしまい、設定したはずの"太郎"という文字が出てきません... XPを使ってコンパイル実行するとちゃんと太郎と出てくるのですが、今使っているパソコンがVistaなのが原因なのでしょうか? それとも、設定が間違っていたり、ダウンロードしなければならないものをしていないとかでしょうか?

    • ベストアンサー
    • Java
  • オブジェクトを配列として扱いたい

    Java(オブジェクト指向)を始めて数日の者です。 LinkedListを利用し、インスタンス化したオブジェクトをListに入れて 扱えるようにしたいと考えています。 具体的には LinkedList<クラス名> array = new LinkedList<クラス名>(); クラス名 object1 = new クラス名(); -object1の処理- array.add(object1); -object1の処理- array.add(object1); -object1の処理- array.add(object1); このようにして、object1を配列で管理するイメージです。 object1の処理結果は、毎度変わっています。 しかしこれですと、最後のobject1の処理の内容がすべてのarray(i)に入ってしまいます。 要は、array(i)は全て、同じobject1を参照しているだけ。 object1の変更結果がarray(i)に入っていくというイメージでは無い、ということでしょうか? また、この他でインスタンス化したものを配列で管理できるような方法がございましたら、ご教授いただけると幸いです。m(_ _)m 動的に配列の要素数を変更(要素が追加)ができるようにしたいのです。

    • ベストアンサー
    • Java
  • オブジェクトの参照渡しについて

    メソッドの引数にオブジェクトを指定した場合、 それは「参照渡し」だと理解していました。 でも以下のプログラムでは、指定したオブジェクトに変化がありません。 public static void main(String[] args) { BigDecimal b = new BigDecimal(1); System.out.println(b); test(b); System.out.println(b); } public static void test(BigDecimal b) { b = new BigDecimal(2); } 出力は以下です。 ------------------------- 1 1 ------------------------- どういうことでしょうか? 正しい知識をお教えください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 参照型の2次元配列の作り方

    参照型の2次元配列の作り方 実行結果は、 赤レッド 黄イエロー 青ブルー と画面表示されるようにしたいのです。 class Sample{ public static void main(String[]args){ String[][] str ={{      ?     }}; System.out.println(     ?     ); } } ?のところをどう書いたらよいか御指導御願い致します。

    • ベストアンサー
    • Java
  • 抽象クラスとオブジェクトを格納する配列(java)

    独習java第4版でわからない所があります。 abstract class Widget { String color; abstract int getMass(); public String toString() { return getClass().getName() + ": " + color + ", " + getMass(); } } class WidgetA extends Widget { final static int MASS = 4; WidgetA(String color) { this.color = color; } int getMass() { return MASS; } } class WidgetB extends Widget { final static int MASS = 1; WidgetB(String color) { this.color = color; } int getMass() { return MASS; } } class WidgetC extends Widget { final static int MASS = 5; WidgetC(String color) { this.color = color; } int getMass() { return MASS; } } class WidgetD extends Widget { final static int MASS = 17; WidgetD(String color) { this.color = color; } int getMass() { return MASS; } } class WidgetTypes { static int NUMWIDGETS = 6; public static void main(String args[]) { // 部品を格納する領域を宣言して割り当てる Widget widgets[] = new Widget[NUMWIDGETS]; // 部品を作成する widgets[0] = new WidgetC("Red"); widgets[1] = new WidgetA("Green"); widgets[2] = new WidgetD("Yellow"); widgets[3] = new WidgetB("Magenta"); widgets[4] = new WidgetA("Black"); widgets[5] = new WidgetC("White"); // 部品を処理する int totalMass = 0; for(int i = 0; i < NUMWIDGETS; i++) { Widget w = widgets[i]; System.out.println(w); totalMass += w.getMass(); } // 総重量を表示する System.out.println("Total mass = " + totalMass); } } これはある問題の解答ですが、僕にはどうしても理解出来ない部分があります。 mainのforループ内で Widget w = widgets[i]; totalMass += w.getMass(); となっています。 この仕組がわかりません。 まず Widget w = widgets[i] でWidget型の変数wにWidget型のwidget[i]を代入しているのにw.getMass()がエラーにならない理由がわかりません。(Widgetクラスは抽象クラスなのにwがWidgetクラスのインスタンスになっている?) これは 抽象メソッド( abstract int getMass() ) があるためでしょうか? ちなみにWidgetクラスとそのサブクラスからこの抽象メソッドを削除したらコンパイルエラーが出ました。 ではなぜ抽象クラスの抽象メソッドから、そのサブクラスのメソッドまで範囲が伸びるのでしょうか? どういう仕組でしょうか? この質問を書きながら思ったのですが、どうも配列の仕組みや抽象クラス・メソッドの仕組み、「オブジェクト」と「インスタンス」の違いがよくわかってないようです。 多分問題の本質はそこにあると思うんです。 駄文で申し訳ないです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • インスタンス参照でアクセスできない。代わりに型名?

    画面上に、 名前を入力する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 の配列を持てるでしょうか? (そもそもこういうやりかたはしない?) よろしくお願いします。