- 基本类型和引用类型的不同
对于基本类型,它的值直接保存在变量中;
对于引用类型,它保存的是实际对象的地址,引用指向实际对象,实际对象中保存着内容; - 赋值运算符对基本类型与引用类型的作用
对于基本类型,赋值运算符会直接改变变量的值,原来的值会被覆盖掉;
对于引用数据类型,赋值运算符会改变引用中所保存的地址,原来的地址被覆盖掉,但是原来的对象不会被改变; - 值传递:方法接收的是实参值的拷贝,会创建副本。
引用传递:方法接收的直接是实参所引用的对象在堆中的地址,不会创建副本,对形参的修改将影响到实参。 - 在java中只有值传递
- 代码的实践:
//1. 传递基本数据类型参数 public static void main(String[] args) { int num = 10; to(num); System.out.println("num = " + num); } public static void swap(int a, int b) { int temp=num; temp=num*num; System.out.println("temp = " + temp); } //执行结果: //temp = 100 //num = 10 //num没有变,传递的副本变化了,无论副本内容怎么修改,都不会影响原来的值; //2. 传递引用数据类型参数:数组,字符串都是引用数据类型 public static void main(String[] args) { int[] arr = { 1, 2, 3, 4, 5 }; System.out.println(arr[0]); change(arr); System.out.println(arr[0]); } public static void change(int[] array) { // 将数组的第一个元素变为0 array[0] = 0; } //执行结果: //1 //0 //这里要注意:这里传递的还是值,只不过这个值是实参的地址;也就是说change方法的参数拷贝的是 arr 实参)的地址,因此,它和arr指向的是同一个数组对象。这也就说明了为什么方法内部对形参的修改会影响到实参。 //3. 传递引用数据类型参数ii //一个person的类 public class Person { private String name; // 省略构造函数、Getter&Setter方法 } public static void main(String[] args) { Person xiaoZhang = new Person("小张"); Person xiaoLi = new Person("小李"); swap(xiaoZhang, xiaoLi); System.out.println("xiaoZhang:" + xiaoZhang.getName()); System.out.println("xiaoLi:" + xiaoLi.getName()); } public static void swap(Person person1, Person person2) { Person temp = person1; person1 = person2; person2 = temp; System.out.println("person1:" + person1.getName()); System.out.println("person2:" + person2.getName()); } //输出的结果: //person1:小李 //person2:小张 //xiaoZhang:小张 //xiaoLi:小李 //swap 方法的参数 person1 和 person2 只是拷贝的实参 xiaoZhang 和 xiaoLi 的地址。因此, person1 和 person2 的互换只是拷贝的两个地址的互换罢了,并不会影响到实参 xiaoZhang 和 xiaoLi 。
- 因此java中只有值传递,没有引用传递
如果参数是基本类型的话,很简单,传递的就是基本类型的字面量值的拷贝,会创建副本。
如果参数是引用类型,传递的就是实参所引用的对象在堆中地址值的拷贝,同样也会创建副本。 - 方法的重载
重载就是在一个类中,有相同函数的名称,但是形参不同的函数
方法重载的规则:- 方法名称必须相同
- 参数列表必须不同(个数不同,类型不同,参数排列顺序不相同)
- 方法的返回类型可以相同也可以不相同
- 仅仅返回类型不同不足以称为方法的重载
- 可变长参数:一个方法中只能指定一个可变参数,且必须是方法的最后一个参数
- 递归:自己调用自己,必须要有递归头(终止条件)和递归体(处理方法),不然会有栈溢出。