Javaオブジェクトと参照変数

6536 ワード

今日は疲れてあまり言いたくない.原文転送ゲートJavaオブジェクトと参照変数.
引用変数の深い意味については,必ずしも初学の時に深く理解できるとは限らないので,次の2つの言葉の本当の意味を理解することが重要である.
Case cc=new Case();

Case cc;
cc=new Case();

1.まず、スタックとは何か、スタックとは何かを明らかにします.Javaは2種類のストレージエリアを開拓し、両者の特徴を比較した.
きおくりょういき
コンテンツの保存
メリット
欠点
リサイクル
スタック
基本タイプの変数とオブジェクトの参照変数
アクセス速度はスタックよりも速く、レジスタに次いでスタックデータを共有できます.
スタックに存在するデータのサイズと生存期間は決定され、柔軟性に欠けている必要があります.スタックには、基本的なタイプの変数が主に格納されます.
変数の役割ドメインを超えるとJavaは自動的にその変数を解放し、メモリスペースはすぐに他のものとして使用できます.
スタック
newなどの命令によって作成されたオブジェクトと配列
メモリサイズを動的に割り当てることができ、生存期間もコンパイラに事前に教える必要はありません.
実行時にメモリを動的に割り当てるため、アクセス速度が遅い
Java仮想マシンの自動ゴミ回収器による使用されなくなったデータの回収
スタックのストレージ特性は、格納されるデータ型を決定します.
なお、スタック内に格納されるのは、基本タイプの変数(String,intのようなタイプの変数)に加えて、オブジェクトの参照変数も格納される.JAvaでは、参照変数は実際にはポインタであり、スタックメモリ内のオブジェクトインスタンスを指します.
参照変数は、配列またはオブジェクトの名前に相当し、スタック内の参照変数をプログラムで使用してスタック内の配列またはオブジェクトにアクセスできます.
2.参照変数に値を割り当てる
振り返ってコードを見ると
実際には4つのステップに分解されています.
Case cc; '''                cc,  cc=null'''
cc=new Case();
'''
1. new Case()            Case    ,        
2. Case()     Case      
3.                   cc
'''

これで明らかになりました
Javaでは、ここの「=」は値を付ける意味ではなく、オブジェクトのアドレスを変数に渡す.オブジェクトは作成されますが、名前もないので、変数を参照して操作する必要があります.対象、引用、それらの関係をイメージ的に説明するために、あまり適切ではないかもしれない比喩を作ることができます.対象は大きな風船のようなもので、私たちが捕まえられないほど大きい.引用変数は1本の縄で、蒸気球を結ぶのにすぐに聞くことができて、引用変数はどのように伝達しますか?これはJavaの唯一のパラメータ伝達方式である値伝達に関連する.
次のコードを見てください.
    public class ObjectRef {

        '''         '''
        public static void testBasicType(int m) {
        System.out.println("m=" + m);//m=50
        m = 100;
        System.out.println("m=" + m);//m=100
    }
   '''     ,       '''
   '''s sMain        append  ,           “_add”'''

    public static void add(StringBuffer s) {
        s.append("_add");
    }

    '''     ,       '''
    '''             ,    sMain      '''
    public static void changeRef(StringBuffer s) {
        s = new StringBuffer("Java");
    }

    public static void main(String[] args) {
        int i = 50;
        testBasicType(i);
        System.out.println(i);'''i=50'''
        StringBuffer sMain = new StringBuffer("init");
        System.out.println("sMain=" + sMain.toString());'''sMain=init'''
        add(sMain);
        System.out.println("sMain=" + sMain.toString());'''sMain=init_add'''
        changeRef(sMain);
        System.out.println("sMain=" + sMain.toString());'''sMain=Java'''
    }
}

ここを見ると、伝わるのは対象の引用なのに、なぜ伝える価値があるのかという感じがします.伝達する前に、伝達されるのは引用ですから、私たちのいわゆる「伝達住所」は、伝達する前に、それは実例で、伝達されるのは実例の住所です.ここで伝達される値は,最初から最後までアドレスであり,sMainはアドレスであり,sに伝達されるかアドレスである.次のように感じてください.
    '''     ,       '''
    '''s sMain,        append  ,           “_add”'''
    public static void add(StringBuffer s) {
        s.append("_add");
    }

以上の出力の結果は「init_add」
ここで,sは新しいオブジェクトを参照し,パラメータの伝達はまったく行われず,以前のsMainとは関係ない.
    '''     ,       '''
    '''             ,    sMain      '''
        public static void changeRef(StringBuffer s) {
            s = new StringBuffer("Java");
            }

以上の出力の結果は「Java」
『Javaプログラミング思想』の一節を引用する.
オブジェクトを別のオブジェクトに割り当てた場合、実際にはリファレンス(Reference)を別の場所から別の場所にコピーします.
参考記事:Javaオブジェクトとその参照:http://blog.sina.com.cn/s/blog_4 cd 5 d 2 bb 0100 ve 9 r.html javaスタックの詳細:http://blog.csdn.net/bangbt/article/details/6232299