基本数据类型
基本数据类型:
整型:int
字节型:byte
长整型:long
短整型:short
单精度浮点型:float
双精度浮点型:double
字符型:char
布尔型:boolean
基本数据类型采用值传递,特点是传递的是值的拷贝,传递完后两者就没有关系了,方法内和方法外的值互不相干。
引用数据类型
引用数据类型:
引用数据类型建立在基本数据类型的基础上,除八种基本数据类型以外的数据类型都属于引用数据类型,包括数组、类和接口。引用数据类型是由用户自定义,用来限制其他数据的类型。
引用数据类型采用引用传递,指的是在方法调用时,传递的参数是按引用进行传递,其传递的内容为引用的地址,也就是变量所对应的内存空间的地址,传递的是地址的拷贝。也就是说,对于一个参数传递,存在的情况为两个地址指向同一个内存空间。
二、内存分配示意图
基本数据类型
引用数据类型
案例
public class ParameterPassing {
public static void main(String args[]) {
double st1;
StringBuffer sb1, sb2;
String sb3;
char s[] = {'a', 'p', 'p', 'l', 'e'};
st1 = 3.5;
sb1 = new StringBuffer("apples");
sb2 = new StringBuffer("pears");
sb3 = new String("pear");
modify(val, sb1, sb2, sb3, s);
System.out.println(val);
System.out.println(sb1);
System.out.println(sb2);
System.out.println(sb3);
System.out.println(s);
}
public static void modify(double a, StringBuffer r1,
StringBuffer r2, String r3, char s[]) {
a = 6.8;
r1.append(" taste good");
r2 = null;
r3 = "banana";
s[2] = 'R';
}
}
执行结果:
3.5
apples taste good
pears
pear
apRle
解释:
- st1是基本数据类型,值拷贝的两者直接互不影响。所以modify方法内对a的操作不影响主方法的val的值。
- sb1为StringBuffer型,不属于基本类型,因此是引用传递。r1.append()修改了r1地址对应的内存空间的值,因此sb1的值改变了。
- sb2同样是StringBuffer型,属于引用传递。但r2=null是修改的r2的地址的值而不是r2地址指向的内存空间的值,因此sb2指向的还是原来指向的内存空间,且内存空间的值未被改变。
- sb3为String类型,属于引用传递。但是String类型是一个特殊的类,在方法内改变String的值并不能改变主方法中的String的值,r3=“banana"是创建了一个banana字符串然后让方法内的变量r3指向"banana”,但方法内的r3和主方法中的r3不是同一个变量,因此String仍然是pear。
- 数组为引用传递,且s[2]=‘R’,确实修改的是内存空间的值,因此char数组的值被改变。