- PR -

ネストクラスについて

1
投稿者投稿内容
トッティ
会議室デビュー日: 2005/04/18
投稿数: 11
投稿日時: 2005-05-27 14:12
現在、SJC-P取得のために勉強をしていますが、以下のネストクラスに
ついてなぜそうなるのか理解できません。
@の場合はコンパイルできるのですが、Aではコンパイルエラーととなります。
@もAもOuterクラスのオブジェクトをInnerクラスの前に置いているという
事では同じだと思うのですが、、

------------------------------------------------------
class Outer{
static class Inner{ }
}
class Test0_10{
public static void main(String args[]){
//@↓これはOK
//Outer.Inner in =new Outer.Inner();

//A↓これはコンパイルエラーとなる
Outer out = new Outer();
Outer.Inner in = out.Inner();
}
}
-------------------------------------------------------
taka
会議室デビュー日: 2005/05/03
投稿数: 14
投稿日時: 2005-05-27 14:23
1は"Outer.Inner"というクラスをnewしてますが、2は"Inner"というメソッドの呼び出しです。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-05-27 16:52
蛇足ですが。

引用:

Aではコンパイルエラーととなります。



コンパイルエラーメッセージをじっくり読むとよろしいに違いありません

ちなみに、書籍には書いてあるかもしれませんが、Inner が static でない場合に Inner のオブジェクトを一発で生成しようとすると、以下のような割とややこしい式になります。
コード:

Outer.Inner in = (new Outer()).new Inner();



追記:
言語仕様を調べたところ、括弧なしで
コード:

Outer.Inner in = new Outer().new Inner();


でも良いようです。
けれども、ますますわかりにくいコードになってしまいますね。

[ メッセージ編集済み 編集者: Gio 編集日時 2005-05-27 17:06 ]
トッティ
会議室デビュー日: 2005/04/18
投稿数: 11
投稿日時: 2005-05-27 17:04
なるほど!

Aは@と等価ではなく、
Outer.Inner in = (new Outer()).Inner();
になる訳ですね。

ご教示して頂きありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)