プロが教えるわが家の防犯対策術!

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},
};

とやってもコンパイル時にエラーになってしまいます。

A 回答 (4件)

JAVAでは、配列もオブジェクトなので、


Class cls[] とは書きません。
Class[] cls と書きます("Classオブジェクトの配列"というオブジェクトの名前がcls)
シンタックスシュガーなので、Class cls[] と書いてもエラーにはなりませんが、
クラス名側に[]を記述すると覚えましょう。
なので、この状態だと配列の名前を定義しただけのものになってしまい、実体がありません。
実体定義は newを使います(C++と同じ)

さらに、JAVAはオブジェクト指向言語で、Userクラスは独立したオブジェクトとして所持されますので、メソッド経由でアクセスする必要があります。
メソッドが必要ないのなら、コンストラクタで初期設定することになります。

というわけで、C++でできていることは多分JAVAではできません。
似たような記述をしようとしたら、こうなるはずです。

/* Userクラスはこんな風に */
class User{
String uname;
int id;
// デフォルトコンストラクタ
User(){
uname = null;
id = -1;
}
// 値を設定するコンストラクタ
User(String uname,int id){
this.uname = uname;
this.id = id;
}
}

/* 使うときにはこんな風に */
User[] usr = new User[]{
new User("moritan2",12345),
new User("moritan3",56789)
};

※C++っぽい初期化が本当はできるのかもしれないけども、私は知らない(^-^;
※いいのか?>私
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
それでは初期化データを書くところを、コンストラクタの呼び出しに変えてみます。

お礼日時:2007/07/18 22:33

そのコードはC++の構造体とクラスの実装が基本的に同じである事と、


C++ではスタック上にインスタンスを作れる特徴を最大限に活かしたC++でしかありえないコードです。
※クラスとしては使い方間違ってます。
Javaには構造体はありませんし、インスタンスはヒープにしか作れないので同じコードは書けないと思います。
コンストラクタに初期値を与える形で実装するのが真っ当な方法だと思います。
    • good
    • 0

私も Java には詳しくないので,間違っているかもしれませんが…



Java の変数は,基本データ型 (数値型,boolean 型) 以外はすべてポインタです.
(言語仕様上「ポインタ」と呼ぶかどうかは議論があるようですが,
 少なくとも VM の事実上の実装はそうですし,VM の仕様書でも
 「ポインタ」という言葉が使われています.
  The Java(TM) Virtual Machine Specification
  CHAPTER 2 Java Programming Language Concepts
  2.4.6 Reference Types, Objects, and Reference Values)

したがって配列型も,その配列要素 (非基本データ型) も,
実際にはポインタなので C++ 風に書けば次のようになります.

Java:User [] user;
C++:User **user;

あとは moritan2 さんならおわかりでしょう.

┌なお,配列要素が基本データ型や文字列の場合は,C/C++ の静的初期化と同様の構文が
│使えるようです.(とはいっても実際には動的に初期化しているはずですが.)

とほほのJava入門 → 変数 → 配列
http://www.tohoho-web.com/java/variable.htm#array
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
私が知りたいのは、C++の例のような、初期化されたデーターを持つ、クラスをどうやって記述するかです。配列ならできるのは分かります。実際クラスではなく、配列で無理やりやったところもあります。しかし、質問のようのような文字列と、値を持ったクラスの初期値を記述する方法がわかりません。
なお、「それはjavaでは無理です」というのも立派なご回答になります。それなら別の方法を考えます。現在無理なのかできるのかがわからないのです。

お礼日時:2007/07/18 22:30

実体を確保するにはnewが必要です。



例えば、intの要素を5つ持つ配列dataを宣言するには
int data[] = new int[5];
と書きます。

質問者さんの書き方では「実体を確保してない」のでエラーです。

C++でnew、deleteを使った事があるならピンと来る筈です。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
私が知りたいのは、C++の例のような、初期化されたデーターを持つ、クラスをどうやって記述するかです。

お礼日時:2007/07/18 22:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!