之前对Java对象和引用的定义不清晰,赶紧补上,然后来讲讲我对 对象 和 引用 的理解。
开宗明义
StringBuffer s = new StringBuffer("new String");
new StringBuffer(“new String”)是对象
s 是 对new StringBuffer(“new String”)的引用
StringBuffer 是类
然后解释
Java创建一个对象是在堆空间上创建的 所以对象指的就是堆空间上的那一片区域
s可以是指向对象那一片的东西 用专业术语来讲 就是通过我们可以操作的标识符(s)就是引用
举个例子理解一下 一个气球由两部分组成一个充满气体的气球和用来捆住气球的绳子。 气球就是对象,而绳子就是引用。
再来说说 参数传递的问题
package Reference;
public class reference {
static void Basic(int m){
m +=10;
System.out.println(m);
//11
}
static void reference_add(StringBuffer s){
s.append("_add");
}
static void reference_init(StringBuffer s){
s = new StringBuffer("New String");
}
public static void main(String argv[]){
int num = 1;
Basic(num);
System.out.println(num);
//1
StringBuffer s = new StringBuffer("new String");
reference_add(s);
System.out.println(s);
//new String_add
s = new StringBuffer("new String");
reference_init(s);
System.out.println(s);
//new String
}
}
首先 明确一点 Java只有值传递如果参数是基本类型那么得到的是一个基本类型的拷贝 如果参数是引用那么得到的是引用的拷贝
从三个方法中可以看出 如果我们传基本类型进去是不会发生改变的
但是我们传引用进去 就值得讨论的
我们传的是引用 得到是引用的一个拷贝 然后引用是指向对象的一个可控我们操作的标识符
在reference_add中 我们通过引用在对象的空间中修改了内容 所以修改是有效的
在reference_init中 我们修改了拷贝引用所指向的内容 所以无论怎么修改只是拷贝引用指向的对象发生了变化 和 引用指向的对象无关
用我之前的例子来讲就是 我们用过绳子往气球上画了一些东西 所以这个气球发生了变化
但是我们用第二根绳子捆住气球之后 把这个第二根绳子捆住的气球换了一个新气球,新气球发生的所有变化和老气球无关。