一:值传递
使用该方式传递的参数,参数原始的值不发生变化
适用范围:八种基本数据类型(char,byte,boolean,short,int,long,double,float)和String*String也是传递的地址,但是String对象一旦被改变,就是生成新的对象
二:引用传递
使用该方式传递的参数,在方法内部修改参数的值时,参数原始的值发生改变适用范围:除String以外的所有复合数据类型,包括数组、类和接口
三:总结
传值方式,传递的是值的副本。方法中对副本的修改,不会影响到调用方。
传引用方式,传递的是引用的副本。此时,形参和实参指向同一个内存地址。对引用副本所指向的对象的修改,如修改对象属性、容器内容等,会影响到调用方。对引用副本本身(对象地址)的修改,如设置为null,重新指向其他对象,不会影响到调用方。
例子:
/**
* @Title: Main.java
* @Package com.lian
* @Description: TODO()
* @author: Lian
* @date: 2018年7月3日 下午5:39:37
* @version V1.0
*/
package com.lian;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
/**
* @ClassName: Main
* @Description:TODO()
*/
class A{
int value;
A(int x){
this.value=x;
}
}
public class Main {
static void fun(List x,Integer y,int[] z,String str,A a) {
x.add(1111);
y=111111111;
z[0]=555;
str="change";
//此a非主函数中的a,它是主函数中a的一个复制,同指向一个地址,现在它指向了另一个地址,但不影响主函数中的a
a=new A(10);
}
static void fun1(A a) {
//此a非主函数中的a,它是主函数中a的一个复制,同指向一个地址,现在它要改变这个地址中的值。
a.value=10;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Integer> list=new ArrayList<Integer>();
list.add(100);
Integer x=new Integer(1);
int[] num=new int[2];
num[0]=1;
String str="str";
A a=new A(-1);
fun(list,x,num,str,a);
System.out.println("list:"+list);//会改变
System.out.println("Integer:"+x);//不会改变
System.out.println("num[0]:"+num[0]);//会
System.out.println("a.value:"+a.value);//不会
System.out.println("fun1:");
fun1(a);//其值会改变
System.out.println("a.value:"+a.value);
}
}