今天看研究了下java的参数调用问题,花费了好长时间.有时候简单的问题不是想想就当自己懂了的,还是得通过demo来验证.晚上看完了corejava上讲继承的章节,明天敲几个demo巩固巩固.最近在用一款doit.im的任务管理app,前一天晚上或者一早起来安排一下一天的任务,晚上检查完成情况.
/* * java中的参数传递:按值调用.基本类型传递数值,引用类型传递地址值 * 方法参数使用情况: * 一个方法不能修改一个基本数据类型的参数,int change * 一个方法可以改变一个对象参数的状态,buffer change * 一个方法不能让对象参数引用一个新的对象,buffer swap */ public class CallbyTest { public static void main(String[] args) { int x = 2; int y = 3; System.out.println("before: " + x + "......." + y); change(x, y);// System.out.println("after: " + x + "......." + y); System.out.println("---------------------------------------"); String s1 = "aaa"; String s2 = "bbb"; System.out.println("before: " + s1 + "......." + s2); change(s1, s2);// String类是不可变的,只是改变了参数引用,而没有改变参数对象的状态 // swap(s1,s2); System.out.println("after: " + s1 + "......." + s2);// 虽然传递的是地址值,change方法里b的引用改变了 System.out.println("---------------------------------------"); // String s11 = new String("aaa");//这段表明了String类无论哪种定义方式传递的仍为地址值 // String s22 = new String("aaa");//new方式传递String对象地址值 // String s11 = "aaa";//""方式传递字符串常量地址值 // String s22 = "bbb"; // System.out.println("before: " + s11 + "......." + s22); // swap(s11, s22); // System.out.println("after: " + s11 + "......." + s22); // System.out.println("---------------------------------------"); StringBuffer sb1 = new StringBuffer("aaa"); StringBuffer sb2 = new StringBuffer("bbb"); System.out.println("before: " + sb1 + "......." + sb2); change(sb1, sb2);// 引用值传递,改变了引用对象的状态 System.out.println("after: " + sb1 + "......." + sb2); System.out.println("---------------------------------------"); StringBuffer sb3 = new StringBuffer("aaa"); StringBuffer sb4 = new StringBuffer("bbb"); System.out.println("before: " + sb3 + "......." + sb4); swap(sb3, sb4);// 获得两个对象引用的拷贝,该方法交换的也是这两个对象的拷贝. System.out.println("after: " + sb3 + "......." + sb4); } public static void change(int a, int b) { a = b; b = b + 3; System.out.println("int change a:" + a + ‘\t‘ + "int change b:" + b); } public static void change(String a, String b) { a = b;// 字符串变量引用字符串常量"bbb"的地址值 b = a + b;// String类不可更改,创建新的字符串常量"bbbbbb",并将其地址值赋给字符串变量b System.out.println("string change a:" + a + ‘\t‘ + "string change b:" + b);// 这里a仍为"bbb"证明了引用的是字符串常量 } public static void change(StringBuffer a, StringBuffer b) { a = b;// 按值传递 System.out.println("before append b: " + a);// 此时b未改变 b.append(a);// b引用的对象状态放生改变 System.out.println("buffer change a:" + a + ‘\t‘ + "buffer change b:" + b);// b改变了,a引用的b地址值,故这里显示a为b改变后的 } public static void swap(StringBuffer a, StringBuffer b) { StringBuffer temp = null; temp = a; a = b; b = temp; System.out.println("buffer swap a:" + a + ‘\t‘ + "buffer swap b:" + b); } public static void swap(String a, String b) { String temp = null; temp = a; a = b; b = temp; System.out.println("string swap a:" + a + ‘\t‘ + "string swap b:" + b); } }
时间: 2024-12-26 13:38:03