写这篇文章时,其实还是不理解Java中的参数传递只有传值没有传址(传引用)。这里引用知乎上大神的讲解来记录一下。
一、基本类型和引用类型
1 int num = 10; 2 String str = "hello";
num是基本类型,num的值直接保存在变量中,变量保存在哪里呢?
str是引用类型,变量中保存的是实际对象的地址,这种变量为“引用”,引用指向实际对象,实际对象中保存着内容。
二、赋值运算符(=)
1 num = 20; 2 str = "java";
赋值操作有两个含义:
1)放弃原有的值或引用
2)得到=右侧变量的值或者引用
基本类型num,赋值运算符会直接改变变量的值,原值被覆盖
引用类型str,赋值运算符会改变引用中保存的地址,原来的地址被覆盖掉,但是原来的对象不会被改变。比如,"hello"字符串对象没有被改变,如果没有被任何引用指向,该字符串对象就会被视为垃圾,就会被垃圾回收器回收。
三、调用方法的过程
参数传递基本上就是赋值操作
1基本类型:
1 void foo(int value) 2 { 3 value = 100; 4 } 5 foo(num);//num没有被改变
2未提供改变自身方法的引用类型:
1 void foo(String text) 2 { 3 text = "windows"; 4 } 5 foo(str); //str也没有被改变
3提供了改变自身方法的引用类型
1 StringBuilder sb = new StringBuilder("iphone"); 2 void foo(StringBuilder builder) 3 { 4 builder.append("4"); 5 } 6 foo(sb); //sb被改变了,变成了“iphone4”
4提供了改变自身方法的引用类型,但是不使用,而是使用赋值运算符
1 StringBuilder sb = new StringBuilder("iphone"); 2 void foo(StringBuilder builder) 3 { 4 builder = new StringBuilder("ipad"); 5 } 6 foo(sb);//sb没有被改变,还是"iphone"
3 4示例理解:
3图解:
4图解:
测试示例:
1 class Employee 2 { 3 public int age; 4 } 5 public class Main 6 { 7 public static void changeEmployee(Employee employeeY) 8 { 9 // employeeY = new Employee(); 10 employeeY.age = 1000; 11 } 12 public static void main(String[] args) 13 { 14 Employee employee = new Employee(); 15 employee.age = 100; 16 System.out.println(employee.age); 17 changeEmployee(employee); 18 System.out.println(employee.age); 19 } 20 }
如果不注释第9行的代码,输出为:
100
100
也就是employ的age并没有改变,这是为什么呢?
注释掉第9行代码,输出就是:
100
1000
这时候employee的age是改变了的,为什么呢?
疑问待求证!!