Java的参数传递总结
JAVA的参数传递总是传"值",但是传值方式也分为两种方式,它们是靠传递参数的类型区分的。这两种类型分别为JAVA的基础类型和Object(对象)类型;基础类型包括boolean,byte,short,char,int,long,float,double,而Object就是对象,如数组.在参数为基础类型时,见代码:
public class A{
public static void main(String arg[]){
int a=3;
method1(a);
System.out.println(a);
}
public static void method1(int a){
a=4;
}
}
此时结果的输出将是3,而且只要你的值在Main函数中没变,a的值不管怎么传都不回变,这是因为a是传值,而这个"值"是a的一个拷贝,a的值在传递后的改变只是改变了a的拷贝的内容,并没有改变真正的a的值;对于参数为对象
public class A{ public class A{
public static void main(String arg[]){ public static void main(String arg[]){
int[] a=new int[1]; int[] a=new int[1];
a[0]=3; a[0]=3;
method1(a); method1(a);
System.out.println(a[0]); System.out.println(a[0]);
} }
public static void method1(int[] a){ public static void method1(int[] a){
a[0]--; a=new int[0];
} a[0]=4;
} }
}
左边的结果将是2,右边的结果将是3(未变),原因是:在传递的参数为对象时,这个传递的"值"中放的内容实际上是对向所在的地址,左边的情况是指针定位到对象的地址后,在上面把内容给改了,所以数组的值后会改变,而右边的情况为给对象新分配了一个指针到新的地址上面去,所以所有的操作都在新的地址上面,并不会影响原来的值。注:对于String,Interger,Boolean,Double等的系统对象,它们虽然是Object,但是任何方式的传递参数的值得改变并不会影响原来的值。
转自 http://www.newsmth.net/pc/pccon.php?id=2206&nid=215001
=============================
一道面试题
结果是hello
结论(可能不对啊) 参数传递的是值传递,string比较特殊。基本类型是不会改变值的,对象是会改变的属性值的,但string也是传递的对象啊,还得研究下,写个例子
JAVA的参数传递总是传"值",但是传值方式也分为两种方式,它们是靠传递参数的类型区分的。这两种类型分别为JAVA的基础类型和Object(对象)类型;基础类型包括boolean,byte,short,char,int,long,float,double,而Object就是对象,如数组.在参数为基础类型时,见代码:
public class A{
public static void main(String arg[]){
int a=3;
method1(a);
System.out.println(a);
}
public static void method1(int a){
a=4;
}
}
此时结果的输出将是3,而且只要你的值在Main函数中没变,a的值不管怎么传都不回变,这是因为a是传值,而这个"值"是a的一个拷贝,a的值在传递后的改变只是改变了a的拷贝的内容,并没有改变真正的a的值;对于参数为对象
public class A{ public class A{
public static void main(String arg[]){ public static void main(String arg[]){
int[] a=new int[1]; int[] a=new int[1];
a[0]=3; a[0]=3;
method1(a); method1(a);
System.out.println(a[0]); System.out.println(a[0]);
} }
public static void method1(int[] a){ public static void method1(int[] a){
a[0]--; a=new int[0];
} a[0]=4;
} }
}
左边的结果将是2,右边的结果将是3(未变),原因是:在传递的参数为对象时,这个传递的"值"中放的内容实际上是对向所在的地址,左边的情况是指针定位到对象的地址后,在上面把内容给改了,所以数组的值后会改变,而右边的情况为给对象新分配了一个指针到新的地址上面去,所以所有的操作都在新的地址上面,并不会影响原来的值。注:对于String,Interger,Boolean,Double等的系统对象,它们虽然是Object,但是任何方式的传递参数的值得改变并不会影响原来的值。
转自 http://www.newsmth.net/pc/pccon.php?id=2206&nid=215001
=============================
一道面试题
public static void main(String arg[]) {
String str = "hello";
method2(str);
System.out.println(str);
}
public static void method2(String str) {
str += "world";
}
结果是hello
结论(可能不对啊) 参数传递的是值传递,string比较特殊。基本类型是不会改变值的,对象是会改变的属性值的,但string也是传递的对象啊,还得研究下,写个例子
package co.xx;
public class Hello {
public static void main(String arg[]) {
int a = 3;
String str = "hello";
int[]aa = {1};
Test test = new Test();
method1(a);
method2(str);
method3(aa);
method4(test);
System.out.println(a);
System.out.println(str);
System.out.println(aa[0]);
System.out.println(test.i);
// 结果
// 3
// hello
// 0
// 99
}
public static void method1(int a) {
a = 4;
}
public static void method2(String str) {
str += "world";
}
public static void method3(int[] aa) {
aa[0]--;
}
public static void method4(Test test) {
test.i--;
}
}
class Test{
int i = 100;
}