当前位置: 技术问答>java相关
请高手帮我解释解释!一定给分!
来源: 互联网 发布时间:2015-05-01
本文导语: 这个例子讲了什么意思?我怎么看不懂? ---------------------------------------------------------- Java编程语言只由值传递参数,也就是说,参数不能由被调用的方法来改变。当一个对象实例作为一个参数传递到方法中时,...
这个例子讲了什么意思?我怎么看不懂?
----------------------------------------------------------
Java编程语言只由值传递参数,也就是说,参数不能由被调用的方法来改变。当一个对象实例作为一个参数传递到方法中时,参数的值就是对象的引用。对象的内容可以在被调用的方法中改变,但对象引用是永远不会改变的。
下面的代码例子可以阐明这一点:
1 public class PassTest {
2
3 float ptValue;
4
5 // Methods to change the current values
6 public void changeInt (int value) {
7 value = 55;
8 }
9
10 public void changeStr (String value) {
11 value = new String ( " different " );
12 }
13
14 public void changeObjValue (PassTest ref) {
15 ref.ptValue = 99.0f;
16 }
17
18 public static void main (String args[]) {
19
20 String str;
21 int val;
22
23 // Create an instance of the class
24
25 PassTest pt = new PassTest ();
26 // Assign the int
27 val = 11;
28
29 // Try to change it
30 pt.changeInt (val);
31
32 // What is the current value?
33 System.out.println ( " Int value is: " + val);
34
35 // Assign the string
36 str = new String ( " hello " );
37
38 // Try to change it
39 pt.changeStr (str);
40
41 // What is the current value?
42 System.out.println ( " Str value is: " + str);
43
44 // Now set the ptValue
45 pt.ptValue = 101.0f;
46
47
48 // Now change the value of the float
49 // through the object reference
50 pt.changeObjValue (pt);
51
52 // What is the current value?
53 System.out.println ( " Current ptValue is: " +
54 pt.ptValue);
55 }
56 }
这个代码输出如下内容:
c:studentsource> java PassTest
Int value is: 11
Str value is: hello
Current ptValue is: 99.0
字符串对象是不会被changeStr()改变的,但是,PassTest对象的内容被改变了。
----------------------------------------------------------------
这是说的什么意思呀?
----------------------------------------------------------
Java编程语言只由值传递参数,也就是说,参数不能由被调用的方法来改变。当一个对象实例作为一个参数传递到方法中时,参数的值就是对象的引用。对象的内容可以在被调用的方法中改变,但对象引用是永远不会改变的。
下面的代码例子可以阐明这一点:
1 public class PassTest {
2
3 float ptValue;
4
5 // Methods to change the current values
6 public void changeInt (int value) {
7 value = 55;
8 }
9
10 public void changeStr (String value) {
11 value = new String ( " different " );
12 }
13
14 public void changeObjValue (PassTest ref) {
15 ref.ptValue = 99.0f;
16 }
17
18 public static void main (String args[]) {
19
20 String str;
21 int val;
22
23 // Create an instance of the class
24
25 PassTest pt = new PassTest ();
26 // Assign the int
27 val = 11;
28
29 // Try to change it
30 pt.changeInt (val);
31
32 // What is the current value?
33 System.out.println ( " Int value is: " + val);
34
35 // Assign the string
36 str = new String ( " hello " );
37
38 // Try to change it
39 pt.changeStr (str);
40
41 // What is the current value?
42 System.out.println ( " Str value is: " + str);
43
44 // Now set the ptValue
45 pt.ptValue = 101.0f;
46
47
48 // Now change the value of the float
49 // through the object reference
50 pt.changeObjValue (pt);
51
52 // What is the current value?
53 System.out.println ( " Current ptValue is: " +
54 pt.ptValue);
55 }
56 }
这个代码输出如下内容:
c:studentsource> java PassTest
Int value is: 11
Str value is: hello
Current ptValue is: 99.0
字符串对象是不会被changeStr()改变的,但是,PassTest对象的内容被改变了。
----------------------------------------------------------------
这是说的什么意思呀?
|
java是传递对象的引用,当调用changeObjValue()时,传进pt的引用,他所
指的对象与外面的pt实际上是同一个。你用pt.ptValue=99.0时,实际已经改变了外面的ptValue了。而在另外的changStr()你用value=“”;实际上是把这个引用指向“”而已。他原来也是指向“”的。
一个与changeObjValue相同的例子。
BufferString bs=new BufferString("qqqq");
changeBufferString(BufferString point)
{
point.append("wwwww");
}
调用changeBufferString(bs)这个函数后bs的值为qqqqwwww。
因为point也是指向bs对象的,在函数里添加了字符。
指的对象与外面的pt实际上是同一个。你用pt.ptValue=99.0时,实际已经改变了外面的ptValue了。而在另外的changStr()你用value=“”;实际上是把这个引用指向“”而已。他原来也是指向“”的。
一个与changeObjValue相同的例子。
BufferString bs=new BufferString("qqqq");
changeBufferString(BufferString point)
{
point.append("wwwww");
}
调用changeBufferString(bs)这个函数后bs的值为qqqqwwww。
因为point也是指向bs对象的,在函数里添加了字符。
|
这段话的意思就是:java进行参数(原始数据类型)传递时,被调用方法得到的只是原变量的一个值拷贝,因此它的只能对这个拷贝进行操作,当然就不能改变原变量的值了。但如果参数是对象,则被调用方法得到的是原对象的一个引用,因此它就能通过该引用对原对象进行操作,所以原对象的内容也就可以在被调用方法中改变了。对象的引用实际上是一个指针,如果被改变了那它所指向的对象不久改变了么??例子里面的字符串对象是个特殊例子,在这里把它当作原始数据类型。
这样解释不知道你明白没??
这样解释不知道你明白没??
|
public void changeObjValue (PassTest ref) {
15 ref.ptValue = 99.0f;
16 }
改变了pt.ptValue 的值,因为它直接对地址操作,
其它只是改变了引用的数值
15 ref.ptValue = 99.0f;
16 }
改变了pt.ptValue 的值,因为它直接对地址操作,
其它只是改变了引用的数值
|
如果是基本类型,传递时先拷贝这个值再传过去
如果是对象,拷贝这个引用再传过去
例如声明了如下函数:
void foo(int a);
void fooo(Object o);
调用时:
int s=5;
Vector v=new Vector();
foo(s); 相当于int a=s; foo(a);
fooo(o):相当于Vector vv=v; fooo(vv); vv和v指向同一个对象
如果是对象,拷贝这个引用再传过去
例如声明了如下函数:
void foo(int a);
void fooo(Object o);
调用时:
int s=5;
Vector v=new Vector();
foo(s); 相当于int a=s; foo(a);
fooo(o):相当于Vector vv=v; fooo(vv); vv和v指向同一个对象