【JAVA】オブジェクト参照と参照


BSSセグメント
BSSセグメント(bss segment)は、通常、プログラムで初期化されていないグローバル変数を格納するために使用されるメモリ領域を指す.BSSは、英語Block Started by Symbolの略称である.BSSセグメントは静的メモリ割り当てに属する.
データセグメント
≪データ・セグメント|Data Segment|emdw≫:データ・セグメント(data segment)は、通常、プログラムで初期化されたグローバル変数を格納するために使用されるメモリ領域を指します.データ・セグメントは静的メモリ割当てに属します.
コードセグメント
コードセグメント(code segment/text segment)は、通常、プログラム実行コードを格納するために使用されるメモリ領域を指す.この領域の大きさは、プログラムの実行前に決定され、メモリ領域は通常読み取り専用であり、一部のアーキテクチャでは、コードセグメントが書き込み可能であり、プログラムの変更が可能である.コードセグメントには、文字列定数などの読み取り専用の定数変数も含まれる場合があるなど.コードセグメントは、プログラムコードが格納されたデータであり、マシン内のいくつかのプロセスが同じプログラムを実行している場合、同じコードセグメントを使用することができます.
ヒープ
ヒープ(heap):ヒープは、プロセス実行中に動的に割り当てられたメモリセグメントを格納するために使用され、そのサイズは固定されず、動的に拡張または縮小することができる.プロセスがmallocなどの関数を呼び出してメモリを割り当てると、新しく割り当てられたメモリがヒープに動的に追加される(ヒープが拡張される).freeなどの関数を使用してメモリを解放すると、解放されたメモリがヒープから除去される(ヒープが縮小される)
スタック
スタック(stack):スタックはスタックとも呼ばれ、ユーザ格納プログラムが一時的に作成したローカル変数である.すなわち,我々の関数括弧"{}"に定義された変数(ただし、static宣言の変数は含まれません.staticはデータセグメントに変数を格納することを意味します).また、関数が呼び出されると、そのパラメータも呼び出しを開始するプロセススタックに押し込まれ、呼び出しが終了するまで関数の戻り値もスタックに格納されます.スタックの先進的な先行特性のため、スタックは呼び出し現場を保存/復元するのに特に便利です.つの意味では、スタックを一時的なデータを格納、交換するメモリ領域と見なすことができます.
基本タイプ
JAVA
8種類の基礎データ型とreference(オブジェクト参照)はスタックメモリに格納.基本タイプ(primitive type)のオブジェクト
byte(  ) 8 -128 - 127 0
shot(   ) 16 -32768 - 32768 0
int(  ) 32 -2147483648-2147483648 0
long(   ) 64 -9233372036854477808-9233372036854477808 0 
float(   ) 32 -3.40292347E+38-3.40292347E+38 0.0f
double(   ) 64 -1.79769313486231570E+308-1.79769313486231570E+308 0.0d
char(   ) 16 ‘ \u0000 - u\ffff ’ ‘\u0000 ’
boolean(   ) 1 true/false false
reference(    )

     。          ,   new。    ,Java               。

オブジェクト参照の割り当て
package com.cn.mark.test;

public class Student {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Student() {
    }

    public Student(String name) {
        this.setName(name);
    }

    public void say() {
        System.out.println(this.getName());
    }

    public static void new_student(Student s) {// 4.[   copy_s_reference]
        s.say();                               // 5.[   copy_s_reference         zhangsan]
        s = new Student("lisi");               // 6.[   copy_s_reference          ]
    }                                          // 7 [      s_object   s_reference         ]


    public static void main(String[] args) {
        Student s = new Student("zhangsan");// 1.[s   reference       s_reference] 
        s.say();                            // 2.[s_reference               say   ]
        new_student(s);                     // 3.[  s   reference copy     ,      copy_s_reference]
                                            // [s_reference   copy_s_reference             ]
                                            // [  copy_reference    new_student]


        s.say();                            // 8. [ s_reference    zhangsan]

    }

}

Student s = null;//オブジェクトリファレンス(reference)メモリに存在するスタックs=new Studio();//newは、メモリのスタック(heap)上でオブジェクトに空間を開き、右側のnewがスタック内にオブジェクトを作成するアドレスをオブジェクトリファレンスに付与します.
1)右側の「new Studio」は,Studioクラスをテンプレートとしてスタック空間にStudioクラスオブジェクト(Studioオブジェクトとも略称する)を作成する.
2)末尾の()は,オブジェクト作成直後にStudioクラスのコンストラクタを呼び出し,生成したばかりのオブジェクトを初期化することを意味する.構造関数は必ずあります.書かなかった場合、Javaはデフォルトのコンストラクション関数を追加します.
3)左側のStudent sは、Studentクラス参照変数を作成します.Studentクラスリファレンスとは、後でStudentオブジェクトを指すオブジェクトリファレンスです.
4)"="オペレータは、作成したばかりのStudioオブジェクトを参照させます.