java中怎么区分按值传递和引用传递

2024-11-19 05:36:41
推荐回答(4个)
回答(1):

其实主要是看 参数列表声明中参数名的属性
引用的意义是起个别名 其本身指的就是实际传入的那个参数地址 这和c++中指针功能是相近的
而按照值传递 是传递一个参数副本进去 也就说这个副本必是非地址型的变量

正如zhuifeng6464 所说,

如果参数以8大基本数据类型定义的 则为按值传递,如果参数以类名或某个引用类型的变量定义的则为按引用传递.-------------摘的

基本数据类型 变量是存储方式是比较精简的,而对于复杂数据类型 诸如class定义的类的对象 那么那对象名所指的虽然是该对象存储的首地址 而其存储方式上则相对复杂庞大

而函数本身的参数列表基于存储空间的限制 是不支持复杂的数据结构这种存储方式(因为他太浪费空间了)的,那么作为复杂数据类型的传递 只能以地址 有就是引用的方式存在,

这个是我个人的理解

回答(2):

8种数据类型是值传递,在常量池中的都是值传递,例如int 1=10;10在常量池中,就是值传递,还有像“s”(char类型)
引用传递的原因:以字符串为例,由于字符串没有固定长度,定义字符串后,会在内存中给予一处空间,这时对字符串的处理就是引用他的地址,这就是引用传递的原因,希望对你有用

回答(3):

其实很简单的呢,先来看引用传递的那个:
obj作为参数传递到change方法里,那,如果我让你在方法里做这样的操作: obj = null;
你猜,obj的值会被改变么?

void change(CallByRef obj) {
obj = null;
}

public class Test {
public static void main(String[] args) {
CallByRef obj = new CallByRef(15, 20);
System.out.println("调用change方法前 obj=" + obj);
obj.change(obj);
System.out.println("调用change方法后 obj=" + obj);
}
}

嘿嘿,你肯定知道,最后的obj的值不会是null。
这就和值传递的那个方法一样的结果嘛~都一样的~
obj被改变的只是它的属性而已~如果num有属性,我也可以改变它的属性,只可惜我们没办法让int类型有属性~

不知道我有没有把自己表达清楚呢?

原理就是,传进去的都是引用(可能有错误的地方,但大致是这样样子,稍微看看就好):
num传进去,传的是num的地址,通过num可以改变这个地址里指向的内存的值。而当我们使用num的时候,得到的值也是num这个地址里指向的内存的值。
obj传进入,传的是obj的地址,通过这个地址,可以找到obj的属性的地址,所以,我们只是通过obj的地址去修改了obj的属性。
好吧,我不知道怎么表达了,你百度一下,会更好~

回答(4):

在一个方法中 如果参数以8大基本数据类型定义的 则为按值传递,如果参数以类名或某个引用类型的变量定义的则为按引用传递.-------------摘的。
这个你分清变量在内存中的分配就可以理解了。