您好,登錄后才能下訂單哦!
在開始學(xué)java的時(shí)候就接觸到這“對(duì)象”和 “引用”的概念,一直很模糊,今天就總結(jié)一下,算是對(duì)得起這和長時(shí)間的學(xué)習(xí)吧。
Demo demo = new Demo();
這樣的語句應(yīng)該是再常見不過的了,左邊的就是引用,右邊的才是我們據(jù)說的對(duì)象。
引用是存放在棧區(qū)的,而對(duì)象是放在堆區(qū)的。形同于C里邊的指針,demo指向new出來的新對(duì)象。這倆人的關(guān)系應(yīng)該是互相獨(dú)立的,一個(gè)對(duì)象可以有多個(gè)引用, 同樣一個(gè)引用也可以引用多個(gè)對(duì)象。
我們經(jīng)常遇到的參數(shù)的傳遞,在java中,一般都是值傳遞,但需要說明一下的是,如果一個(gè)方法的形參是一個(gè)對(duì)象,那么這,就是引用的傳遞了,運(yùn)行完這個(gè)方法以后,原來的值會(huì)發(fā)生改變。 因?yàn)椋覀儗?duì)對(duì)象是不能直接操作的,一般都通過對(duì)象的引用來操作對(duì)象。來看下面的例子:
這是一個(gè)非常簡單的類: public class Demo { private int a = 1 ; public int getA() { return a; } public void setA(int a) { this.a = a; } } 在下面這個(gè)類中會(huì)用它的對(duì)象作為一個(gè)方法的形參: 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的值 } }
我們可以看到運(yùn)行后的結(jié)果,如果是值的傳遞,改變前和改變后應(yīng)該是一樣的,但事實(shí)卻相反以。這應(yīng)該不需要再解釋什么了吧~
再看看這個(gè)吧:
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; 這里用到的才是對(duì)象 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; } } }
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。