八大数据类型和String 在进行传递的时候 不会改变.
八大数据类型
public class parameterValue { //值传递 public static void main(String[] args) { int x = 10; method(x); System.out.println(x); } public static void method(int mx) { mx = 20; } /** * 在栈内存中申请mx 这时候 x 和mx 存储的值 是一样的,但是x和mx的地址是不一样的,mx=20;并不影响x的值. * 八大基本数据类型都是这个吊样. * */ }
String
package oneDay; public class RefDemo1 { public static void main(String[] args) { String nameString = "小飞"; String yuanString; yuanString = new String("asd"); System.out.println(yuanString); method(nameString); System.out.println(nameString); } private static void method(String name) { name = "小贝"; // 相当于 name = new String(); name = "小贝"; // 相当于 指向改变 /** * 简单解释一下. String nameString 相当于在栈空间中申请了一块空间,用于存储引用地址(此时没有引用地址为空). * nameString = 小飞; 相当于 nameString = new String("小飞"); 这时候 在堆内存申请了一块空间用于存储 实际的值. * 也就是说 在method 这个方法 当中. 形参 String name 相当于 String name; name = nameString; 这时候 name和nameString在栈内存中 * 存储的引用地址 是一样的 , 当时当 * name = "小贝";的时候 该代码 相当于 name = new String("小贝"); 在堆内存中新申请了一块空间, 将该地址 赋予name 这时候 name和nameString在栈内存中 * 存储的值(引用地址) 就又不一样了. 所以 八大基本数据类型和String 一样 在 方法中进行传递的时候 不会改变自身的值, 但是 类 可以改变自身的值.. * * */ } }
类
package oneDay; public class RefDemo { //引用传递 public static void main(String[] args) { Duck duckYuan = new Duck(); System.out.println("Duck age = "+duckYuan.age); method(duckYuan); System.out.println("Duck age = "+duckYuan.age); } private static void method(Duck duck) { duck.age = 5; } /** * Duck duckYuan = new Duck(); 在栈内存和堆内存中申请空间,并将 堆内存的地址 放入栈内存中,以待使用. * 形参中的 Duck duck 在栈内存中申请空间,并将上面的duckYuan内存储的堆内存的地址放入duck中, * 然后 方法内的duck.age = 5; 这时候的duck和duckYuan栈内存地址虽然不同,但期内存储的堆内存的地址 都是指向同一块堆内存地址的,这样就改变了原来的值. * * */ } class Duck{ int age = 2; //省略封装 }
为什么 String也是类但是 不会改变呢? 总结一下:
在两个方法当中
name = "小贝";
duck.age = 5;
第一行的 name = "小贝"; 相当于 name = new String("小贝"); 在堆内存中 重新申请了一块空间. 然后将地址赋予 name.
第二行的 duck.age 是 在堆内存中 已经有了空间,然后只是将 该堆空间age 赋值为5.
第一行和第二行相同的是 栈内存的空间都是相同的, 不同的是 String 重新申请了一块堆空间 改变的不是原始的 所以值不变, 第二行 没有重新申请空间, 使用的是 原始的堆空间所以 值 改变了.