[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 1731] Re: static をつけるべき ?



   "TAKEKAWA Tsutomu <takekawa@xxxxxxxxxxxxxx>"さんは書きました:

> このサンプルでFuturePicに相当するのがHogeクラス
> なのですが、static を付けても付けなくても
> 動作します。
> #なんか、見落としているような気もしますが....
「The Java言語仕様書」
発行:アジソン・ウェスレイ・パブリッシャーズ・ジャパン
の付録 内部クラス仕様書から抜粋します。
「加えて、プログラマはクラスを任意のトップレベル・クラスのstaticメンバ
として定義することができる。staticクラス・メンバとしてのクラスやパッケージ・
メンバとしてのクラスのことを、どちらもトップレベル・クラスと呼ぶ。こういった
トップレベル・クラスは自身のインスタンス変数のみを直接使用できるという点が
内部クラスと異なっている。」

だそうです。
試しにTestクラスのフィールドに
private String name = "Hello, Test";
を追加し、Hogeクラスのメソッドhoge()の中でnameフィールドへアクセスする
コードを書いてみると、static class Hogeとしたときにコンパイルエラーが
発生します。

> public class Test {
    private String name = "Hello, Test";
>   class Hoge { // static class Hoge
> 	void hoge(){ 
> 	  System.out.println("hoge"); 
 	  System.out.println(name); 
> 	}
>   }
:

「Bruce EckelのJavaプログラミングマスターコース上」
発行:ピアソン・エデュケーション
7.6節 インナークラス p.274 staticなインナークラスから引用

  1 staticなインナークラスのオブジェクトを生成するのに、外側のクラスの
  オブジェクトは必要ない。
  2 staticなインナークラスのオブジェクトから外側のクラスのオブジェクト
  にはアクセスできない。

同p.276から引用
 通常はinterfaceの中にはコードを書くことはできないが、staticなインナー
 クラスをinterfaceの中に置くことは可能だ。そのクラスはstaticであるため、
 interfaceの規則に違反しているわけではない.staticなインナークラスは、
 interfaceの名前空間の中にのみ置かれる。

  interface IInterface {
    static class Inner {
      int i, j, k;
      public Inner() {}
      void f() {}
    }
  }

だそうです。


---
Toru TAKAHASHI