在开始学java的时候就接触到这“对象”和 “引用”的概念,一直很模糊,今天就总结一下,算是对得起这和长时间的学习吧。
Demo demo = new Demo();
这样的语句应该是再常见不过的了,左边的就是引用,右边的才是我们据说的对象。
引用是存放在栈区的,而对象是放在堆区的。形同于C里边的指针,demo指向new出来的新对象。这俩人的关系应该是互相独立的,一个对象可以有多个引用, 同样一个引用也可以引用多个对象。
我们经常遇到的参数的传递,在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; } } }
本文出自 “我的天地” 博客,请务必保留此出处http://eaglemengwei.blog.51cto.com/5172327/1389301