JAva(/android)におけるオブジェクトと参照

2212 ワード

Javaを習い始めた頃からこの「オブジェクト」と「引用」の概念に触れていて、ずっと曖昧だったので、今日はまとめてみましょう.
Demo demo = new Demo();
このような文はもっとよくあるはずですが、左は引用で、右は私たちが言っている対象です.
リファレンスはスタック領域に格納され、オブジェクトはスタック領域に格納されます.Cの中のポインタと同じ形で、demoはnewから出てきた新しいオブジェクトを指します.この2人の関係は互いに独立しているべきで、1つのオブジェクトは複数の参照を持つことができて、同じ1つの参照も複数のオブジェクトを参照することができます.
我々がよく遭遇するパラメータの伝達はjavaでは一般的に値伝達であるが,一つのメソッドのパラメータがオブジェクトである場合,これが参照伝達であり,このメソッドを実行すると元の値が変化することを説明する必要がある.なぜなら、オブジェクトを直接操作することはできません.一般的には、オブジェクトの参照によってオブジェクトを操作します.次の例を見てみましょう.
          :
public class Demo {
    private int a = 1 ;
    public int getA() {
        return a;
    }
    public void setA(int a) {
        this.a = a;
    } 
}
                      :
public class ObjectDemo {
    public static void main(String[] args) {
        Demo demo = new Demo();
        System.out.println("   :" + demo.getA()); // --    :1
                                                                                                                         
        new ObjectDemo().fun(demo);
        System.out.println("   :" + demo.getA()); // --    :1000
                                                                                                                         
    }
    public void fun(Demo test){
        test.setA(1000);   //     a  
    }
}

実行後の結果は,値の伝達であれば,変更前と変更後は同じであるべきであるが,事実は逆である.これ以上説明する必要はないでしょう~
これを見てみましょう.
public class MainActivity extends Activity {
    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        AAA demo = new AAA();    
        View view = new View(MainActivity.this);
        view.setTag(demo);  // a=99  
        //view.setTag(new AAA());   //a=55;          
               
        demo.a = 100;
        Log.i(TAG, "demo: "+demo.a);    // -- 100
               
               
        AAA test = (AAA) view.getTag();
        Log.i(TAG, "test: "+test.a);   // -- 100
    }
    class AAA{
        int a = 55 ;
        public int getA(){
            a = 99;
            return a;
        }
    }
}