- - PR -
オブジェクトについて
| 投稿者 | 投稿内容 | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-08-11 15:36
Javaについて勉強していますが
どうしてもひっかかる点があります。 Objクラスを他のクラスから利用したいと考えています。 ------------------------------ @Start ------------------------------ public class Obj{ String[] str = {"正確","不正確"}; } ------------------------------- @End ------------------------------- @だと、コンパイルは正常に通りました。 宣言と代入を同時に行っていればOKなのでしょうか。 ------------------------------ AStart ------------------------------ public class Obj{ String[] str = new String[2]; //このようなコンストラクタを作った場合もコンパイルは通りました。 public Obj(){ str[0] = new String(); str[0] = "正確"; } } ------------------------------- AEnd ------------------------------- Aだと、他クラスでオブジェクトを作成する時にコンストラクタが 実行されるので、OKなのでしょうか。 ------------------------------ BStart ------------------------------ public class Obj{ String[] str = new String[2]; //strの初期化を行うメソッド public void set(){ str[0] = new String("正確"); } } ------------------------------- BEnd ------------------------------- Bだと、他クラスでオブジェクトを作った後に、 オブジェクト変数.setメソッドで初期化を行うのでOKなのでしょうか。 @ABならまだ納得できますが、次の例は納得できません。 ------------------------------ CStart ------------------------------ public class Obj{ String[] str = new String[2]; str[0] = new String("正確"); } ------------------------------- CEnd ------------------------------- しかしCだとエラーになってしまいます。 Cの場合だとObjクラスのインスタンスを作成していないのに Objクラス内で、Stringオブジェクトを作成しようと しているので、エラーが出てしまったのでしょうか。 エラー内容は以下の通りです。 C:\\gomi>javac gomi.java gomi.java:26: ']' がありません。 str[0] = new String("正確"); ^ gomi.java:26: <identifier> がありません。 str[0] = new String("正確"); ^ gomi.java:26: シンボルを解釈処理できません。 シンボル: クラス str 位置 : Gomi の クラス str[0] = new String("正確"); ^ エラー 3 個 わかる方がいらっしゃれば、ご教授お願いします。 | ||||||||||||||||
|
投稿日時: 2003-08-11 15:38
自己レスです
コンパイルの javac gomi.javaとありますが ただしくは javac Obj.javaです。 よろしくお願いします。 | ||||||||||||||||
|
投稿日時: 2003-08-11 16:02
unibon です。こんにちわ。
#丸付き数字は機種依存文字なので使わないようにご留意ください。 別の掲示板ですが、たまたま同じ話題がありました。 http://www.vc-net.ne.jp/~ytp/bbs/java/bbs15281.html のスレッドです。 いろいろやりかたはありますが、好みとしては初期化ブロック (正確には「オブジェクト初期化子(Object Initializer)」と言うのでしょうか?) を使うのが良いような気がします。 http://www.y-adagio.com/public/standards/tr_javalang/1_1Update.htm#12269 #以下、あとで追加しました(2003-08-12 13:08 頃)。 "Object Initializer" ではなく "Instance Initializer" でした。 http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#246032 [ メッセージ編集済み 編集者: unibon 編集日時 2003-08-12 13:08 ] | ||||||||||||||||
|
投稿日時: 2003-08-11 17:54
返信ありがとうございます。
つまり、書き方自体がおかしくて コンストラクタもしくはメソッドの中で 操作を行えば問題なくコンパイルが通るということですね。 public class Obj{ String[] str = {"正確","不正確"}; } これは、オブジェクトを作成していないのかな・・・。 | ||||||||||||||||
|
投稿日時: 2003-08-11 17:59
オブジェクトを生成していますね。 ただ、unibonさんのリンクを見るとVMは 上記コードを以下のように認識するみたいですね。
| ||||||||||||||||
|
投稿日時: 2003-08-11 21:16
(株)ぽちさん
返信ありがとうございます。 VMによって解釈の違いがあるんですね まだまだ勉強不足です・・・。 ぽちさんのおっしゃっていることは、ばっちりわかりました。 ありがとうございました。 | ||||||||||||||||
|
投稿日時: 2003-08-11 22:38
FieldDeclaration: FieldModifiersopt Type VariableDeclarators ; VariableDeclarators: VariableDeclarator VariableDeclarators , VariableDeclarator VariableDeclarator: VariableDeclaratorId VariableDeclaratorId = VariableInitializer VariableDeclaratorId: Identifier VariableDeclaratorId [ ] VariableInitializer: Expression ArrayInitializer String[] str = {"正確","不正確"}; の構文は Type VariableDeclarators ; Type VariableDeclaratorId = VariableInitializer ; Type VariableDeclaratorId = ArrayInitializer ; と解釈できるので FieldDeclaration として適法です。
ClassBody: { ClassBodyDeclarationsopt } ClassBodyDeclarations: ClassBodyDeclaration ClassBodyDeclarations ClassBodyDeclaration ClassBodyDeclaration: ClassMemberDeclaration InstanceInitializer StaticInitializer ConstructorDeclaration ClassMemberDeclaration: FieldDeclaration MethodDeclaration ClassDeclaration InterfaceDeclaration ; String[] str = new String[2]; の構文は Type VariableDeclaratorId = VariableInitializer ; と解釈できるので適法です。str[0] = new String("正確"); は式文としては解釈できるのですが、クラス本体及びメンバ宣言をすべき箇所に書かれているため、InstanceInitializer StaticInitializer ConstructorDeclaration FieldDeclaration MethodDeclaration ClassDeclaration InterfaceDeclaration ; の何れかに該当しなければなりません。しかしながら、何れにも該当しないためコンパイラがエラーを出します。
[ メッセージ編集済み 編集者: お犬様 編集日時 2003-08-11 23:00 ] | ||||||||||||||||
|
投稿日時: 2003-08-12 11:47
ごめんなさい。 VMではなくコンパイラですね。 | ||||||||||||||||
