public class TestPsss
{
public void change(int a)
{
a=100;
}
public static void main(String[] args)
{
int pass=50;
TestPass p=new TestPass();
System.out.println(pass);
p.change(pass);
System.out.println(pass);
}}
请问结果是什么,为什么?请详细解释一下
{
public void change(int a)
{
a=100;
}
public static void main(String[] args)
{
int pass=50;
TestPass p=new TestPass();
System.out.println(pass);
p.change(pass);
System.out.println(pass);
}}
请问结果是什么,为什么?请详细解释一下
这个应该可以算是 java 中的基础了
pass 只是把他的植传递过去了
也就是把他的拷贝传了过去
如果传的是对象那本来的植也会改变
最简单的是int[]的数组
你可以试一下
基本类型是传值
如果是对象那就相当于C中的传地址(句柄)就会改变了
比如string类型就是字符串类
{
public void change(int a)
{
a=100;
System.out.println(a);//你看看这里打印的是什么就知道了.方法结速,堆栈释放内存了。
}
public static void main(String[] args)
{
int pass=50;
TestPass p=new TestPass();这里你新new 了一个实例
System.out.println(pass);
p.change(pass);改变的是新的对象的值了.
System.out.println(pass);对原有对象的值没有影响.
}}
c语言里的地址,其实就是java里的引用对象。但是java保留的基本数据类型int,long,short,double,char。你如果把int都换成Interger的话,做一下比较,估计你就明白了。Integer是一个类型,它产生的引用对象就是地址了。
------------------------------------------------------------------------------------
初来乍到,请各位大侠多指教不足!!!
这个好像在C语言就应该涉及到了。就是传值和传址的区别。在调用函数的时候,参数都压到栈里了,如果是【传值】,比如说 pass ,那么他修改的就是pass传到栈里的那个内存中的数据,但是如是传址(例如c里的取地址&pass的),那么是修改你传到栈里的这个地址所指向的内存。当程序运行完毕的时候,将栈清空,这个时候,如果是传值的话,显然你修改的那个数据就被释放了,但是,如果你是传址的话,虽然栈同样释放,但是释放掉的是指向你修改数据的那个内存的地址而已。你做的修改被成功保留了。
c语言里的地址,其实就是java里的引用对象。但是java保留的基本数据类型int,long,short,double,char。你如果把int都换成Interger的话,做一下比较,估计你就明白了。Integer是一个类型,它产生的引用对象就是地址了。
------------------------------------------------------------------------------------
初来乍到,请各位大侠多指教不足!!!
各位大哥指导指导
50这个问题说难也难..说简单也容易....你把JAVA中参数传递的机制了解一下就明白了
int类型只是传递了一个引用的副本..
这个能写在相同的类里吗?
不懂
{
int b[]=new int[100];
public void change(int a[])
{
b=a;//给你留个问题把b=a换成a=b,结果会不一样,如果你能想明白为什么就ok了如果不明白,
//我会接贴靠诉你的
b[0]=100;
System.out.println(a[0]);//你看看这里打印的是什么就知道了 }
public static void main(String[] args)
{
int pass[]=new int[100];
pass[0]=20;
TestPass p=new TestPass();这里你新new 了一个实例
p.change(pass);.
System.out.println(pass[0]);//pass[0]=100改变了
}}
你的那个方法change(int a),你调用了他一下,但是这个方法没有返回什么东西,int a只是形参,不改变实际的pass那个实参,你输出pass是多少还是多少.
如果那个方法 public int change(int a)
{
a=100;
return a;
}
而且你输出的是System.out.println(change(pass));
那就是100了.
说你的人很多,别不好意思不看了,刚刚学都这样.
我也菜鸟一个,刚好知道这个
{
int b[]=new int[100];
public void change(int a[])
{
b=a;//给你留个问题把b=a换成a=b,结果会不一样,如果你能想明白为什么就ok了如果不明白,
//我会接贴靠诉你的
b[0]=100;
System.out.println(a[0]);//你看看这里打印的是什么就知道了 }
public static void main(String[] args)
{
int pass[]=new int[100];
pass[0]=20;
TestPass p=new TestPass();这里你新new 了一个实例
p.change(pass);.
System.out.println(pass[0]);//pass[0]=100改变了
}}
我不是很懂,你什么时候接啊?
2.我们把数组pass传给方法change(),传的是引用,此时 int [] a 数组就指向了pass 所指向的内存A
3.b=a 所以 b 也就指向了 a 所指向的内存A
4.b[0]=100 修改的是内存A中的内容,而pass也指向A所以pass[0]也变成了100
当我们把b=a 换成 a=b 时 由于b 已经在上面int b[]=new int[100];定义了开辟了另一内存B
所以a 就指向了内存B 而pass 是指向内存A 的所以pass[0]没有改变当我们传过去的是int a 时 传的是a值的副本所以不论你怎么改变a 的副本你都不可能改变a 的本来的值的现在应该明白了把
. 如果参数是对象,函数可以改变参数的属性。
. 如果参数是对象,函数不能使参数指向新的对象。
因为你是值传递,一个方法不能改变一个基本数据类型的参数。
下面看一下你写代码具体的执行过程:
1.a被初始化为pass值的一个拷贝(也就是50)。
2.后a 为100时,但是PASS仍然是50。
3. public void change(int a)
{
a=100;
}这个方法结束后,参数变量a不再使用。
看看和这段程序的区别就知道了
system.out.println(p.pass);
p.change(pass);
没有传递给pass变量,那有什么作用。。相信楼猪本来的意思是想经过change方法后输出 100 吧,代码如下public class TestPass
{
public int change(int a)
{
return a=100;
}
public static void main(String[] args)
{
int pass=50;
TestPass p=new TestPass();
System.out.println(pass);
pass=p.change(pass);
System.out.println(pass);
}}要传递给pass,谨记!!!再说,这个也不是什么难题,楼主太粗心了
看书一定要认真哦,
偶也是初学者,共勉~~~
{
参数是形式参数;
参数出了方法还是原来的值;
}