java中参数传递(基本类型,非基本类型;远程非远程)
2007-06-26 20:17
387 查看
其实这个问题我原来翻译(破除java神话之二:参数是传址的 )、转帖别人的详细解释(java 应用程序中的按值传递语义 )和专门解释( 我对《java 应用程序中的按值传递语义》的理解 )过,不过现在看来,原来翻译或者解释的角度是有问题的,从底层的角度解释并不直观,在交流的时候也容易引起误解,最终不能达成一致意见。下面以最终的效果来解释参数的传递方式:
1、对于原始数据类型,也就是int、 long、char之类的类型,是传值的,如果你在方法中修改了值,方法调用结束后,那个变量的值没用改变。
2、对于对象类型,也就是object的子类,如果你在方法中修改了它的成员的值,那个修改是生效的,方法调用结束后,它的成员是新的值,但是如果你把它指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。
代码如下:
public class tester {
public static void main(string[] args) {
int primitive = 2;
changeprimitive(primitive);
//primitive的值依然是2
myclass myclass = new myclass();
changeobject(myclass);
//myclass仍然指向的是执行changeobject之前的那个对象
//但是myclass.i等于3了
}
public static void changeprimitive(int primitive) {
primitive = 3;
}
public static void changeobject(myclass myclass) {
myclass.i = 3;
myclass = new myclass();
}
}
class myclass {
int i;
}
对于远程调用,无论是什么类型,调用结束后,传入的参数和以前没用任何变化(当然前途是直接调用远程方法,如果中间经过其它的proxy类或者facade类,不能保证那些类对对象没用修改)。至于是通过local接口进行调用的,也应该属于本地调用,和上面说的情况应该是一致的。
***************************************************************************************************************
package java2;
public class Test2 {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a, b);
System.out.println(a + "," + b);
int k = 1;
double A[] = { 1, 2, 3 };
changeOrNot(k, A);
System.out.println("k: " + k);
System.out.println("A[0]: " + A[0]); System.out.println("A[1]: " + A[1]); System.out.println("A[2]: " + A[2]);
}
public static void operate(StringBuffer x, StringBuffer y) {
x.append(y); //修改是生效的,方法调用结束后,它的成员是新的值
y = x;//object的子类,如果你把它指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。
y.deleteCharAt(0);
}
public static void changeOrNot(int i,double x[]) {
i = -1; //原始数据类型,变量的值没用改变。
x[0] = -2.0;//object的子类,修改是生效的,方法调用结束后,它的成员是新的值
double y[] = x;
y[1] = -3.0;
double z[] = { 4.0, 4.0, 4.0 };
x = z;
}
}
1、对于原始数据类型,也就是int、 long、char之类的类型,是传值的,如果你在方法中修改了值,方法调用结束后,那个变量的值没用改变。
2、对于对象类型,也就是object的子类,如果你在方法中修改了它的成员的值,那个修改是生效的,方法调用结束后,它的成员是新的值,但是如果你把它指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。
代码如下:
public class tester {
public static void main(string[] args) {
int primitive = 2;
changeprimitive(primitive);
//primitive的值依然是2
myclass myclass = new myclass();
changeobject(myclass);
//myclass仍然指向的是执行changeobject之前的那个对象
//但是myclass.i等于3了
}
public static void changeprimitive(int primitive) {
primitive = 3;
}
public static void changeobject(myclass myclass) {
myclass.i = 3;
myclass = new myclass();
}
}
class myclass {
int i;
}
对于远程调用,无论是什么类型,调用结束后,传入的参数和以前没用任何变化(当然前途是直接调用远程方法,如果中间经过其它的proxy类或者facade类,不能保证那些类对对象没用修改)。至于是通过local接口进行调用的,也应该属于本地调用,和上面说的情况应该是一致的。
***************************************************************************************************************
package java2;
public class Test2 {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a, b);
System.out.println(a + "," + b);
int k = 1;
double A[] = { 1, 2, 3 };
changeOrNot(k, A);
System.out.println("k: " + k);
System.out.println("A[0]: " + A[0]); System.out.println("A[1]: " + A[1]); System.out.println("A[2]: " + A[2]);
}
public static void operate(StringBuffer x, StringBuffer y) {
x.append(y); //修改是生效的,方法调用结束后,它的成员是新的值
y = x;//object的子类,如果你把它指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。
y.deleteCharAt(0);
}
public static void changeOrNot(int i,double x[]) {
i = -1; //原始数据类型,变量的值没用改变。
x[0] = -2.0;//object的子类,修改是生效的,方法调用结束后,它的成员是新的值
double y[] = x;
y[1] = -3.0;
double z[] = { 4.0, 4.0, 4.0 };
x = z;
}
}
相关文章推荐
- 由【JAVA中参数传递问题】引发除了基本数据类型和引用类型的思考
- java中传递参数的两种方式(int(基本类型),int[](对象类型))
- 面向对象语言(如Java)中:基本类型与对象在存储和参数传递上的区别
- Java传递基本类型:值传递,对象作为参数:引用传递
- 2013年8月17日、二维数组定义的格式|用java表现一个描述小汽车|基本数据类型参数传递|
- java中基本类型的参数传递和引用类型的参数传递
- 牛客网Java刷题知识点之基本数据类型参数传递和引用数据类型参数传递图解
- Java实现方法中基本类型参数按地址传递
- C#学习基本概念之传递引用类型参数(二)
- 基本、数组、引用类型的参数传递
- js 函数传递参数类型问题(基本类型和引用类型)
- java传递数组类型参数给oracle存储过程
- 面试之路(18)-java的函数参数传递类型之值传递还是引用传递
- Java基础加强:静态导入及可变参数和增强for循环 ,基本数据类型的自动拆箱和装箱
- Java-String类型的参数传递问题
- 基本数据类型参数传递与引用型数据类型参数传递
- JAVA---基本数据类型和引用数据类型传递值得案例
- 基本数据类型的包装类型作为参数传递,以及其他引用类型作为参数传递,以及List中值的交换的一些问题
- Java-String类型的参数传递问题
- java 实现往oracle存储过程中传递array数组类型的参数