Java类是值传递还是引用传递?
展开全部
基本类型是值2113传递,
引用类型
可以看5261作是是
引用传递
.举个简单的例子吧
public
class
tt
{
public
static
void
change(int
a)
{
a=2;
}
public
static
void
change(int[]
A)
{
A[0]=2;
}
public
static
void
main(String[]
args)
{
int
b=1;
change(b);
System.out.println(b);//基本类型4102是
值传递
,所以b的值没有改1653变
int[]
B={1};
change(B);
System.out.println(B[0]);//数组版,对象等引用类型是引用传权递,所以B的值发生改变
}
}
引用类型
可以看5261作是是
引用传递
.举个简单的例子吧
public
class
tt
{
public
static
void
change(int
a)
{
a=2;
}
public
static
void
change(int[]
A)
{
A[0]=2;
}
public
static
void
main(String[]
args)
{
int
b=1;
change(b);
System.out.println(b);//基本类型4102是
值传递
,所以b的值没有改1653变
int[]
B={1};
change(B);
System.out.println(B[0]);//数组版,对象等引用类型是引用传权递,所以B的值发生改变
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你是c/c++或是vb转过来的吗?在java中过多考虑引用(指针)和值之间的关系是步入歧途,这正是java的设计者极力避免你考虑的问题。
你需要明白的是:
1、java中所有方法的参数的传递都是“值传递”;
2、java中所有对象类型的变量的“值”,本质上说,包含了java堆中的实际对象的地址,你可以大体认为java的变量对应了c/c++中的指针(其实这里面有更复杂的机制)。事实上,java并不像c/c++一样明确的区分“值语义”与“引用语义”,java栈中也不会存放任何对象的实体(这点与c/c++不同,c/c++栈中可以存放对象实体),所有的java对象都是在堆中。
概念上的区别在于,我这里提到的“变量”是指java栈中的内容,对应你说的“引用”;我提到的“对象”是指java堆中的实体,对应你说的“值”。而一般java教材中提到的“值传递”,是指这些“变量”的内容的传递,不是java堆中的对象实体的传递。
你用字符串来做实验,并推广为所有java对象的做法,并不是特别合适。java的string类型有特殊的处理:所有编译期认识的字符串,都会被放到常量池,于是下面的语句:
a
=
"s";
b
=
"s";
a和b并不像其它对象一样有创建的动作,都是直接指向常量池中的"s",所以你可以得到a==b。而下面的语句:
a
=
new
string("s");
b
=
new
string("s");
是分别在java堆中创建了2个对象,此时a!=b。
本质上说,对于基本数据类型(整数、字符等),java的符号==,用于判断二者的值是否相等;对于对象类型,java的符号==,用于判断两个变量是否是“同一个对象”,equals()方法才是用于判断两个对象是否相等。
你希望实现的swap逻辑,在java中通常认为是无法实现的。拿你这个例子来说,swapvalue()中的tmpvalue无论怎么更改,只是改变tmpvalue自己的内容(即不断指向不同的对象),并不会改变value中的内容(始终指向同一个对象)。这也是为什么java最初说自己永远是值传递。你只有改变tmpvalue指向的对象的值(通过调用这个对象的方法或是更改它的属性),使用value访问时,才能看到这些改变。
为了弥补这个缺陷,c#才加入了ref关键字,允许传入变量的引用(如果参考c/c++,c#传递的实际是二级指针,它的内容是栈中的变量的地址)。
你需要明白的是:
1、java中所有方法的参数的传递都是“值传递”;
2、java中所有对象类型的变量的“值”,本质上说,包含了java堆中的实际对象的地址,你可以大体认为java的变量对应了c/c++中的指针(其实这里面有更复杂的机制)。事实上,java并不像c/c++一样明确的区分“值语义”与“引用语义”,java栈中也不会存放任何对象的实体(这点与c/c++不同,c/c++栈中可以存放对象实体),所有的java对象都是在堆中。
概念上的区别在于,我这里提到的“变量”是指java栈中的内容,对应你说的“引用”;我提到的“对象”是指java堆中的实体,对应你说的“值”。而一般java教材中提到的“值传递”,是指这些“变量”的内容的传递,不是java堆中的对象实体的传递。
你用字符串来做实验,并推广为所有java对象的做法,并不是特别合适。java的string类型有特殊的处理:所有编译期认识的字符串,都会被放到常量池,于是下面的语句:
a
=
"s";
b
=
"s";
a和b并不像其它对象一样有创建的动作,都是直接指向常量池中的"s",所以你可以得到a==b。而下面的语句:
a
=
new
string("s");
b
=
new
string("s");
是分别在java堆中创建了2个对象,此时a!=b。
本质上说,对于基本数据类型(整数、字符等),java的符号==,用于判断二者的值是否相等;对于对象类型,java的符号==,用于判断两个变量是否是“同一个对象”,equals()方法才是用于判断两个对象是否相等。
你希望实现的swap逻辑,在java中通常认为是无法实现的。拿你这个例子来说,swapvalue()中的tmpvalue无论怎么更改,只是改变tmpvalue自己的内容(即不断指向不同的对象),并不会改变value中的内容(始终指向同一个对象)。这也是为什么java最初说自己永远是值传递。你只有改变tmpvalue指向的对象的值(通过调用这个对象的方法或是更改它的属性),使用value访问时,才能看到这些改变。
为了弥补这个缺陷,c#才加入了ref关键字,允许传入变量的引用(如果参考c/c++,c#传递的实际是二级指针,它的内容是栈中的变量的地址)。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
哈哈
鄙人觉得只有传地址
不管是基本类型还是对象(看你对栈、堆的理解了)
但是如果是用流传递一个对象
这种或者可以叫做传值
鄙人觉得只有传地址
不管是基本类型还是对象(看你对栈、堆的理解了)
但是如果是用流传递一个对象
这种或者可以叫做传值
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询