[Java] 纯文本查看 复制代码
public class Demo {
public static void main(String[] args) {
int a = 10;
change(a);
System.out.println(a); // 1:请问输出什么?
String str = "abc";
change(str);
System.out.println(str);// 2:请问输出什么?
Student s = new Student("张三",13);
System.out.println(s); // 输出 Student [name=张三, age=13]
change(s);
System.out.println(s); // 3:请问输出什么?
change1(s);
System.out.println(s); // 4:请问输出什么?
}
public static void change(String s) {
s = s+"def";
}
public static void change(int a) {
a = a + 10;
}
public static void change(Student s) {
s = new Student("李四",14);
}
public static void change1(Student s) {
s.setName("李四");
s.setAge(14);
}
}
[Java] 纯文本查看 复制代码
public class Demo2 {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a+" "+b);//10 20
change1(a,b);
//形式参数做赋值操作的时候,实际参数不发生改变
//基本类型一般都在栈内存中(所以 堆内存中没有指向 内部也就没有东西嘛),
//所以值能做一些加减乘除、赋值的操作,
//而做完了这些操作,就在占内存中消失了,所以不会影响实际参数
System.out.println(a+" "+b);//10 20
System.out.println("-------------------");
Student s = new Student();
System.out.println(s);//Student [name=null, age=0]
change2(s);//详见方法内部注释
//如果在方法里面是改变形式参数内部的一些东西的时候 那么实际参数发生改变
System.out.println(s);//Student [name=hehe, age=1]
System.out.println("-------------------");
String string = "abc";
System.out.println(string);//abc
change3(string);//详见方法内部注释
//形式参数做赋值操作的时候,实际参数不发生改变
System.out.println(string);//abc
System.out.println("-------------------");
StringBuffer sb = new StringBuffer("hello");
System.out.println(sb);//hello
change4(sb);//详见方法内部注释
//如果在方法里面是改变形式参数内部的一些东西的时候 那么实际参数发生改变
System.out.println(sb);//helloworld
System.out.println("-------------------");
int[] arr ={1,2,5,8,4,3};
System.out.println(Arrays.toString(arr));//[1, 2, 5, 8, 4, 3]
change5(arr,0,1);//详见方法内部注释
//如果在方法里面是改变形式参数内部的一些东西的时候 那么实际参数发生改变
System.out.println(Arrays.toString(arr));//[2, 1, 5, 8, 4, 3]
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));//[1, 2, 3, 4, 5, 8]
System.out.println("-------------------");
StringBuffer sb1 = new StringBuffer("abcd");
StringBuffer sb2 = new StringBuffer("efgh");
change6(sb1,sb2);//详见方法内部注释
System.out.println(sb1);//abcd
//形式参数做赋值操作的时候,实际参数不发生改变
System.out.println("-------------------");
Student s1 = new Student("hehe",1);
Student s2 = new Student("haha",20);
change7(s1,s2);//详见方法内部注释
//形式参数做赋值操作的时候,实际参数不发生改变
System.out.println(s1);//Student [name=hehe, age=1]
}
private static void change7(Student s1, Student s2) {
//引用类型s1指向的是一个地址值,s2也是指向的地址值,那么把s2的地址值赋给了s1,这时候s1指向的地址
//值改变了,而s1内部(堆内存)的东西改变了吗?没有啊 ,等这个方法调用完毕了,地址值的指向也都消失了,
//s1还是指向原来的地址值,原来的地址值内部(堆内存)的东西还是没有改变,所以 赋值操作不会影响实际参数
s1=s2;
}
private static void change6(StringBuffer sb1, StringBuffer sb2) {
//引用类型sb1指向的是一个地址值,sb2也是指向的地址值,那么把sb2的地址值赋给了sb1,这时候sb1指向的地址
//值改变了,而sb1内部(堆内存)的东西改变了吗?没有啊 ,等这个方法调用完毕了,地址值的指向也都消失了,
//sb1还是指向原来的地址值,原来的地址值内部(堆内存)的东西还是没有改变,所以 赋值操作不会影响实际参数
sb1=sb2;
}
private static void change5(int[] arr, int i, int j) {
//引用类型arr指向的其实是一个地址值,那么通过地址值将对象内部(堆内存)的值发生改变了,
//即使这个方法调用完毕了,s所代表的地址的指向消失了,那么对象的内部其实已经改变了,所以形式参数改变实际参数
int temp = arr;
arr = arr[j];
arr[j] = temp;
}
private static void change4(StringBuffer sb) {
//引用类型sb指向的其实是一个地址值,那么通过地址值将对象内部(堆内存)的字符长度改变了,
//即使这个方法调用完毕了,s所代表的地址的指向消失了,那么对象的内部其实已经改变了,所以形式参数改变实际参数
sb.append("world");
}
private static void change3(String string) {
//String也是一个引用类型,但是String的值是放在了常量池中,而且常量池中的值是不能被改变的
//在方法里面这个string所代表的是常量池中值得地址值,那么我说string += "def"这句话在常量池中其实是这样的:“找有没有abcdef,如果有就把abcdef的地址值赋给string
//如果没有就在常量池中创建一个abcdef 并把地址值赋给string”。 然而当我方法用完了 string代表的地址值的指向也消失了,那么原来main方法中的string也不发生改变
string += "def";
}
private static void change2(Student s) {
//引用类型s指向的其实是一个地址值,那么通过地址值将对象内部(堆内存)的属性改变了,
//即使这个方法调用完毕了,s所代表的地址的指向消失了,那么对象的内部其实已经改变了,所以形式参数改变实际参数
s.setName("hehe");
s.setAge(1);
}
private static void change1(int a, int b) {
int temp = a;
a= b;
b=temp;
}
}