第15講 クラスの学習その2
第7話 staticとは?
今話は、staticあるのとないのではどのように違うのかを見ていきます。
class x{
  public int i;
  public static void main(String args[]){
    f();
  }
  public static void f(){
    i=5;
    System.out.println(i);
  }
}
このようにx.javaを作り、コンパイルすると
入門
とエラーしてしまいます。

何が問題であるかお分かりですか。
今までは他のクラスのフィールドを使ってきましたが、
自クラスで定義されているpublic int i;もstaticがないと変数そのものではなく変数の雛形=設計図にすぎません。
ですから、自クラスで用いる場合も一端インスタンス化=実体化しないと使えないのです。
コードをどのように変更すればよいでしょうか。
答えは30行下。














解答コード例
class x{
  public int i;
  public static void main(String args[]){
    f();
  }
  public static void f(){
    x x1=new x(); //インスタンス化=実体化
    x1.i=5;
    System.out.println(x1.i);
  }
}
実行画面
java

それに対して
class x{
  public static int i;
  public static void main(String args[]){
    f();
  }
  public static void f(){
    i=5;
    System.out.println(i);
  }
}
とすると、
初心者
とエラーしません。staticを付けると、自クラス内では、変数の雛形=設計図ではなく変数そのものとなるのです。
ですからインスタンス化しないで直接使えるのです。
ただし、他クラスから使う場合は、staticを付いていても変数の雛形にすぎません。
自クラスから見た場合、static変数は実体(もの)ですが、他クラスから見た場合実体のない幽霊または魂にすぎません。
ですから、他クラスのメソッド(関数)において使う場合には、実体化=インスタンス化=オブジェクト化しなければならないわけです。
C言語やC++のおいては、static変数は静的変数といい、
動的変数が任務を終了(具体的には動的関数が任務を終了する)とその動的変数を収納していたメモリーが開放されて変数が消滅するのに対して、
プログラム実行中はメモリーに常駐して存在し続ける変数のことですが、
Javaの場合は意味合いが違うようです。
C++やVBに馴染んだものとしては少し違和感があります。
基本的には生成消滅を繰り返してメモリーを節約することのできる動的関数と動的変数でプログラムを構成するという方針をとる、
C++やC言語またはVBAの方に、この点に関しては軍配が上がるような気がします。
私の誤解でしょうか。


クラス内では、staticがついた変数は各メソッド=各関数で共通に使うことができます。
クラス内では、C言語やVBのグローバル変数のような役割を果たすのです。
インスタンス化した変数x1.iはローカルに関数fの中でしか使えません。

実は、各関数の中で定義される変数はインスタンス変数なのです。
ですから、各関数内で宣言される変数はすべてローカルで関数内でしか使えません。


すみません。この講は、クラスに関する断片を集めたような講になってしまいました。
クラスの学習は、後何講か入れる予定です。
とりあえずこの講は以上で終了とさせていただいきます。

第16講は、関数の再帰的呼び出しによる魔方陣の汎用的自動生成に挑戦します。
第9講 配列とfor文を利用して3次魔方陣を作ろう 
 第1話 魔方陣とは?
 第2話 順列の生成
 第3話 3次順列の生成
 第4話 2次順列方陣の生成
 第5話 2次順列方陣の生成プログラムの解説
 第6話 3次順列方陣の生成プログラム
 第7話 3次魔方陣の自動生成プログラム
第10講 関数の再帰的呼び出し
 第1話 関数の再帰的呼び出し=関数の自己再帰とは?
 第2話 足し算を関数の自己再帰で行うと?
 第3話 関数の再帰的呼び出しによる累乗の計算
 第4話 関数の再帰的呼び出しによる汎用的順列作成プログラム
 第5話 関数の再帰的呼び出しによる汎用的順列作成プログラム解説その1
 第6話 関数の再帰的呼び出しによる汎用的順列作成プログラム解説その2
 第7話 関数の再帰的呼び出しによる汎用的順列作成プログラム解説その3
 第8話 関数の再帰的呼び出しによる汎用的順列作成プログラム解説その4
 第9話 グローバル変数(メンバ変数)を使用しない汎用的順列作成プログラム
の2つの項を参照しながら是非挑戦してください。

第6話へ 第16講第1話へ

戻る

VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座

初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第2部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第3部