public class Test{
int a;
int b;public void f(){
a =0;
b=0;
int [] c ={0};
g(b,c);
System.out.println(a+" "+b+" "+c[0]+" ");
}
public vodi g(int b,int[] c){a=1;
b=1;
c[0]=1;}public static void mian(String args){
Test obj = new Test();
obj.f();
}打印出来是 1 0 1 应该怎么理解JAVA的传值? 谢谢了!
解决方案 »
- java strgin类赋值疑问
- 关于java里面的回压字符流问题
- 关于字符串的(菜鸟提问)
- 为什么我在Applet中生成一个Frame类型的窗口,窗口底部总带有Java Applet Window字样,能否去掉
- 文件下载的文件名问题
- 在Eclipse中怎样使用componentPaint(),多谢英雄!80分回报,12小时之内结帐
- 问问关于static
- java入门简单吗?
- 用JDBC—ODBC桥连接数据库时,加载JDBC驱动程序的语句是Class.forName(),现在请教其参数是什么?请各位大虾指教!
- 怎么设置环境变量
- 百分求助:java參數中的空格問題
- JAVABEAN是什么? 可以在哪一些场合下用呢?
“状态可转换对象”即 此对象中存在改变对象本身状态(所存储的内容)的方法。如StringBuffer。
b=1;
c[0]=1;}你把这里的参数 int b 改成int d或者其他的值,结果就是 1,1,1了。
因为参数里重新定义了b,所以2个b不一样。
状态可转换对象”时,传递的是引用;当参数为“状态不可转换对象”时,传递的是值。
“状态可转换对象”即 此对象中存在改变对象本身状态(所存储的内容)的方法。如StringBuffer。这个怎么理解啊? 能否结合上面的题目讲讲?
其它对象类型:传引用。
在你的方法g里面,int b是是基本类型,传值,[]c是对象,传引用。
关于这道题目,课本中给出的解释是这样的:请帮我翻成中文吧 谢谢
In java, method arguments are passed by value. When the g() method is called, the argument
b receives a copy of the instance variable b.Since the copy alone is modified , the change of value in parameter b is confined to the g() method.So b's valueremains 0. However, the change made to the instance variable a is reflected , sinc there is only copy of a . So the
value of a becomes 1.
public class Test{
int a; // 成员变量,基本数据类型
int b; // 成员变量,基本数据类型public void f(){
a = 0; // 对成员变量赋值
b = 0; // 对成员变量赋值
// 定义了一个局部变量,是一个int类型的数组,记住,数组是一个引用数据类型,c这个数组的元素是基本数据类型
int[] c = {0};
g(b, c);
System.out.println(a + " " + b + " " + c[0] + " ");
}public vodi g(int b, int[] c){
a = 1; // 这里是对成员变量赋值
b = 1; // 而这个b是参数,可以看成是一个局部变量,对这个局部变量赋值不会改变你的成员变量
c[0] = 1; // 参数c是一个数组,其值与f()方法中的局部变量数组c的值是一样的,都指向堆内存中同一块地址,所以这里对其元素c[0]重新赋值也就会影响到原来的数组元素
}public static void mian(String args){
Test obj = new Test();
obj.f();
}所以,结果就是1 0 1你可以画内存图,将栈内存和堆内存图画出来就很容易明白。
public vodi g(int b,int[] c){
a=1;
b=1;
c[0]=1;
}
b是g()括号里的b 与外围的b无关 所以原来b是多少就是多少
a=1 应该很好理解吧
c[0]=1 传进来的是c[] 不是c[0] 所以你可以改变c[0]的值public void g(int b,int[] c){
int[] d={2};
a=1;
b=1;
c=d;
}
这样c[0]还是0这样理解不知道对不对 反正结果应该不会错
public class Test{
int a;
int b;public void f(){
a =0;
b=0;
int [] c ={0,0};
g(b,c);
System.out.println(a+" "+b+" "+c[0]+c[1]+" ");
}
public void g(int b,int[] c){
int[] d={2,3};
a=1;
b=1;
c=d;
c[0]=1;
}public static void main(String[] args){
Test obj = new Test();
obj.f();
}
}这样的结果是 1 0 00如果改成
public void g(int b,int[] c){
int[] d={2,3};
a=1;
b=1;
c[0]=1;
c=d;
}
那结果就是 1 0 10
int a;
int b;public void f(){
a =0;
b=0;
int [] c ={0};
g(b,c);
System.out.println(a+" "+b+" "+c[0]+" ");
}
public vodi g(int b,int[] c){a=1;//注意这里的a是类属性字段a
b=1;//注意这里的b是g()方法中的局部变量
c[0]=1;//注意这里的c是传进来的数组c}public static void mian(String args){
Test obj = new Test();
obj.f();
}
java里面的参数传递:java里简单的值类型是传值byte,short,int,long,double,float,boolean,char
其他的都是传引用:包括数组和字符串
b 是基本类型,传值,在f()中的赋值不会影响实例变量的b,所有实例变量是缺省值0
c[] 是引用类型,传引用,所以对c[0]的赋值会影响到实例变量的c[]。_________________
欢迎到我在技术圈的Java圈子做客:Java Guru
int a; //成员变量,基本数据类型
int b; //成员变量,基本数据类型 public void f(){
a = 0; //对成员变量赋值
b = 0; //对成员变量赋值
// 定义了一个局部变量,是一个int类型的数组,记住,数组是一个引用数据类型,c这个数组的元素是基本数据类型
int[] c = {0};
g(b, c);
System.out.println(a + " " + b + " " + c[0] + " ");
} public vodi g(int b, int[] c){
a = 1; // 这里是对成员变量赋值
b = 1; // 而这个b是参数,可以看成是一个局部变量,对这个局部变量赋值不会改变你的成员变量
c[0] = 1; // 参数c是一个数组,其值与f()方法中的局部变量数组c的值是一样的,都指向堆内存中同一块地址,所以这里对其元素c[0]重新赋值也就会影响到原来的数组元素
} public static void mian(String args){
Test obj = new Test();
obj.f();
} 请问东方文你说的成员变量 是否是指全局变量?
第一次定义的b 和 g()函数的中b 不是一个b? 所以 b=0?
而第一次定义的变量a 和 g()函数中的a是同一个a? 所以a=1?
而第一定义的c【】由于是一个object, 在g()函数中只是把他对应引用的改变了?(原来是0 变成了1)所以 c【0】=1??
东方文,和国际性文化传播有限公司已经解释的很清楚了
{
int a,b; public void f(){
int[] c = {0,0};
a=0;
b=0;
g(b,c);
System.out.println("a:"+a+" b:"+b+
" c[0][1]:"+c[0]+c[1]);
} public void g(int b,int[]d ){
a=1;
b=1;
int[]e={2,3};
d=e;
e[0]=1; System.out.println(" d[]:"+d[0]+d[1]);
} public static void main(String[] args)
{
new PassByValue().f();
}
}
结果:
d[]:13
a:1 b:0 c[0][1]:00
这个程序要是我来写就是这样:
public class Test{
int a;
int b;public void f(){
a =0;
b=0;
int [] c ={0};
g(b,c);
System.out.println(a+" "+b+" "+c[0]+" ");
}
public void g(int d,int[] e){a=1;
d=1;//如果是要写b=1那b的值肯定会变
e[0]=1;//想写c[0]=1?可以试试看}public static void main(String args){
Test obj = new Test();
obj.f();
}
这样
>>打印出来是 1 0 1 应该怎么理解JAVA的传值?
就很容易理解了,这段程序说明的就是整数值不能传出,数组的值可以传出。
至于什么变量范围,基本都是不记的,就像运算符的优先级,用括号就好了。
(事实上见得多了,自然就记住了,一开始就整这种在实际写程序中不会写的程序,有什么意义?想写编译器为生的同学除外)要把问题搞复杂还不简单吗?就像下面:不简单吗还问题搞复杂要把有这么说话的程序员吗?
对于基本数据类型,由于你操作的是副本,所以不会对原始值产生影响,如你例子中的b
对于引用数据类型,由于副本和原始值都指向的是同一个对象,所以你操作副本和操作原始值其实都是操作的同一个对象,如你例子中的c
Java code
public class Test{
int a;
int b;public void f(){
a =0;//a=0;
b=0;//b=0
int [] c ={0};//c=0
g(b,c);
System.out.println(a+" "+b+" "+c[0]+" ");//a=1,b=0,c[]=1
}
public vodi g(int b,int[] c){a=1;//这里的a是类的成员变量,所以a=1
b=1;//而这里的b不是类的成员变量,而是局部变量,所以原由类的成员变量b仍为0
c[0]=1;//而这里传递为数组的地址,因此修改的仍为成员变量c的内容c=1,注意JAVA中没有C++中所谓的引用传值,而只有值传递,不过对于数组而言
//其传递的是该数组的地址,因此对数组的修改仍然为对其原有地址内容的修改}public static void mian(String args){
Test obj = new Test();
obj.f();
}
注意,何谓传值,比如说,你方法定义的参数,
如果是基本类型,则把基本类型的值赋给他,这个大家都知道如果是引用类型,首先解释下,引用类型的地址是放在栈中的,而值是放堆中的.比如,有个bean是 Student(String id ,String name)
有一个方法接受此类型的参数
g(Student copya){ copya.setId("b");}
-----
我们执行
Student a = new Student("a","a-")
g(a);
System.print.out("a.id = "+a.getId);
-------
结果:
a.id = b;
这个过程做了什么呢,对了,首先,调用a的clone方法复制了一份,取名就叫copya,即方法的形参名
然后,还做了一点,把原先a的 id 和 name ,也就是 "a" "a-"的堆地址给了copya
而copya.setId("b");则改变了这一堆地址的值.而此是a,copya的id都是指向"a"这个堆地址的,
所以必然输出b数组也是同理:和set,get方法一样.c[1]=0,是指向堆,而不是栈的,请注意这点.如果我们把上面的代码改一下,改成这样看看g(Student copya){ Student b = new Student("b","b-");
copya=b;
}
-----
我们执行
Student a = new Student("a","a-")
g(a);
System.print.out("a.id = "+a.getId);
-------
结果:
a.id = a;为什么呢,我们创建的b,把b赋予这个copya,但是这个copya只是一个引用地址,把b的引用地址给copya,
而copya只是a复制的一个对象而已,因为是传值.总结:主要要分清传值的本质,引用类型的值放在堆中,而我们传值的时候,
会让这个复制对象的元素指向这些地址,而这地址是和原先被传对象共享的.所以,我们对这个复制对象改变元素,也就改变了原先对象的值.
注意,何谓传值,比如说,你方法定义的参数,
如果是基本类型,则把基本类型的值赋给他,这个大家都知道如果是引用类型,首先解释下,引用类型的地址是放在栈中的,而值是放堆中的.比如,有个bean是 Student(String id ,String name)
有一个方法接受此类型的参数
g(Student copya){ copya.setId("b");}
-----
我们执行
Student a = new Student("a","a-")
g(a);
System.print.out("a.id = "+a.getId);
-------
结果:
a.id = b;
这个过程做了什么呢,对了,首先,调用a的clone方法复制了一份,取名就叫copya,即方法的形参名
然后,还做了一点,把原先a的 id 和 name ,也就是 "a" "a-"的堆地址给了copya
而copya.setId("b");则改变了这一堆地址的值.而此是a,copya的id都是指向"a"这个堆地址的,
所以必然输出b数组也是同理:和set,get方法一样.c[1]=0,是指向堆,而不是栈的,请注意这点.如果我们把上面的代码改一下,改成这样看看g(Student copya){ Student b = new Student("b","b-");
copya=b;
}
-----
我们执行
Student a = new Student("a","a-")
g(a);
System.print.out("a.id = "+a.getId);
-------
结果:
a.id = a;为什么呢,我们创建的b,把b赋予这个copya,但是这个copya只是一个引用地址,把b的引用地址给copya,
而copya只是a复制的一个对象而已,因为是传值.总结:主要要分清传值的本质,引用类型的值放在堆中,而我们传值的时候,
会让这个复制对象的元素指向这些地址,而这地址是和原先被传对象共享的.所以,我们对这个复制对象改变元素,也就改变了原先对象的值.