文系seの備忘録

Excelの改行でひたすらスペースを打っていた機械音痴の文系seが日々の備忘録を綴る。

staticメソッドから非staticメソッドのアクセスは何故NGか

以下引用:
staticとは:SJC-P対策Java用語集


=============================================================

非 static なメンバはインスタンスと関連して記憶されています
なので、クラスから非 static なメンバへアクセスしようとすると、どのインスタンスの メンバ にアクセスしたいのかコンパイラは判別できません。
そのためクラスから非 static なメンバにアクセスすると、コンパイルエラーとなります。

同様にクラスに関連付けられた static なメソッドから 非 static なメンバにアクセスすると コンパイルエラーになります。


class Test{
public static void main( String argv[] ){
Bug bug1 = new Bug( "無限ループ" );
System.out.println( "Bugの名前:" + Bug.getName() );
}
}

class Bug{
static int num = 0;
String name = "hoge";

public Bug( String s ){
name = s;
num ++;
}

public int getNum(){ return num; }
public static String getName(){ return name; }
}


>javac
Test.java:4: static でない変数 name を static コンテキストから
参照することはできません。
public static String getName(){ return name; }


今までのことをまとめてみると、以下のようになります。

•static 宣言されたメンバはクラスに関連付けられる。
インスタンスとは無関係にクラスが一つだけ保持する)
•クラスから static 宣言されたメンバへはアクセスできる。
インスタンスの参照からも static 宣言されたメンバへはアクセスできる。
•非 static なメソッドから static なメンバへアクセスすることはできる。
•クラスから非 static なメンバへはアクセスできない。
•static なメソッドから 非static なメンバへアクセスすることはできない。


要するにインスタンスや、インスタンスに関連付けられた非 static なメンバからは 全てのメンバにアクセスできます。
クラスやクラスに関連付けられた static なメンバからは、static なメンバにはアクセス できますが、インスタンスに関連付けられた非 static なメンバにはアクセスできません。
(なぜならどのインスタンスのメンバなのか判別できないからです。)





=========================================================

なんとなく分かったような、わかんないような・・・。