- PR -

static なインナークラスのインスタンス可について

1
投稿者投稿内容
ヒデサク
会議室デビュー日: 2008/04/30
投稿数: 9
投稿日時: 2008-05-21 00:59
いつもお世話になっております。
また分からない事が出てきてしまったので、
質問させて下さい。

class Out{
  static class In{
  }
}

上記のコードのインナークラス( static class In )の
インスタンス可の方法についてなのですが、
この場合

  ( new Out() ).new In();

の様にインスタンス可しようとするとコンパイル時に

  >> static クラスの new が修飾されています。

と怒られてしまいます。
static を外してコンパイルするとコンパイルは通るのですが、
なぜ static なインナークラスでは

  ( new Out() ).new In();

の方法でインスタンス可が出来ないのでしょうか。
どなたか教えて頂けないでしょうか。
よろしくお願いいたします。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2008-05-21 01:15
むしろ、staticではないエンクロージング型のnewの仕方から覚えているのが不思議ではありますが…。

staticなネストしたクラスは、名前こそ「外側のクラス名.ネストしたクラス名」となりますが、トップレベルのクラスと扱いは同じです。ですから、
コード:
Out.In in = new Out.In();


となります。

staticがないものはエンクロージング型内部クラスで、外側のクラスのインスタンスと結びついています。
ですから、newするにあたって外側のクラスのインスタンスを指定する必要があります。そのため
コード:
Out out = new Out();
In in = out.new In();


となります。

エンクロージング型の場合は、Inクラスの内部から、Out.thisを用いてOutクラスのインスタンスを参照することができます。
staticなネストしたクラスはインスタンスが結びついているわけではありませんから、Out.thisといった記法は使えません。
1

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