クラスメンバとインスタンスメンバが混在するクラス - 萌えJava超入門
第十七章
クラスメンバとインスタンスメンバの混在

クラスメンバと
インスタンスメンバが
混在するクラス

クラスメンバとインスタンスメンバは混在できます。

目次


1.クラスメンバとインスタンスメンバの混在

クラスメンバとインスタンスメンバの関係を体感するために、
クラスメンバとインスタンスメンバの両方があるクラスを作ってみましょう。

混在できるの?


できるよ。
まあ見てくれ。


クラスメンバ =青
インスタンスメンバ =紫
//Member_03.java
class Member_03 {

    //クラス変数
    static String classValue = "クラス変数";

    //インスタンス変数
    int no;
    String name;

    //コンストラクタ
    Member_03(int no, String name){
        this.no = no;
        this.name = name;
    }

    //クラス変数の表示
    static void printClassValue(){
      System.out.println("クラス変数 classValue = " + classValue);
    }

    //インスタンス変数の表示
    void printThis(){
      System.out.println(no + " " + name);
    }
}

Member_03は
クラスメンバとインスタンスメンバの
両方を持っている。
Member_03クラスを使ってみよう。


//Driver_03.java
class Driver_03{
  public static void main(String[] args){
        //インスタンス化
        Member_03 shiz = new Member_03(1, "館石静乃");
        Member_03 maya = new Member_03(2, "桜井真夜");
        Member_03 tema = new Member_03(3, "安堂てまり");

        System.out.println("\n-------クラス変数-------");
        System.out.println(Member_03.classValue);

        System.out.println("\n-------クラスメソッド-------");
        Member_03.printClassValue();

        System.out.println("\n-------インスタンス変数-------");
        System.out.println(shiz.name);
        System.out.println(maya.name);
        System.out.println(tema.name);

        System.out.println("\n-------インスタンスメソッド-------");
        shiz.printThis();
        maya.printThis();
        tema.printThis();
  }
}


コマンドライン
>javac -encoding UTF-8 Driver_03.java
>java Driver_03

-------クラス変数-------
クラス変数

-------クラスメソッド-------
クラス変数 classValue = クラス変数

-------インスタンス変数-------
館石静乃
桜井真夜
安堂てまり

-------インスタンスメソッド-------
1 館石静乃
2 桜井真夜
3 安堂てまり



インスタンス化しても、
元のクラスが消えるわけではない。
クラスメンバも普通に使える。
クラスはインスタンスとは
別にあるイメージですか?




そうそう!
そんな感じ。


2.図解クラスとインスタンス

今度はクラスとインスタンスのイメージを
図にしてみよう。
クラスの展開とインスタンス化
クラスの展開とインスタンス化

めんどくさい話
クラスファイルは実行されると、メモリのパーマネント領域にクラス情報を展開します。
このタイミングでクラス変数もパーマネント領域に確保されます。
クラス情報の展開はこの一度きりです。
これとは別に、インスタンスは newされる度に、ヒープ領域に配置されます。


クラス(図の緑枠)に記述されたクラスメンバインスタンスメンバは、
それぞれクラスとインスタンスに分かれます。
クラスにはクラスメンバだけが、
インスタンスにはインスタンスメンバだけがあります。

クラスは一個。
インスタンスは new演算子で増える。
メンバの所在はクラスとインスタンスに
分かれるのね。


今度は Drive_03の mainメソッドから、
それぞれのメンバを呼び出している様子だ。
サンプルコードと見比べてみると面白い。
mainメソッドからメンバへのアクセス
mainメソッドからメンバへのアクセス

わかった気もする!!



気もするって...。



つづく

お疲れ様でした。




© 2019 awasekagami