在Java中值传递和引用传递是不一样的,怎么个不一样法呢?他们在内存当中的结构是怎么样的我们通过四个示例,来给大家说道说道,
示例一:值传递
public class ValueDemo{
public static void main(String[] args){
int x = 10;//我们定义了一个基本数据类型的局部变量 是存在栈里边的
method(x) ;
System.out.println(“x=”+x) ;
}
public static void method(int mx){
mx = 20;
}
}
结果是多少呢?是10,为什么是10呢。
因为基本数据类型的变量是存在栈内存的,所以method入栈,然后传值的时候,是把x复制一份传给mx,然后method方法mx变成20,是复制品变成了20,然而x还是10.其实Java当中都是值传递,为什么要分值传递和引用传递呢?接着往下看
示例二:引用传递
public class RefDemo1{
public static void main(String[] args){
Duck d = new Duck();
method(d) ;
System.out.println(“Duck age = ”+d.age) ;
}
public static void method(Duck duck){
duck.age = 5;
}
}
class Duck{
int age = 2; //省略封装
}
其实引用传递也是一种值传递,只不过他的值不是具体的数据,他的值是一个地址,所以叫它引用传递 这里我们写了一个类鸭子类,它有一个年龄2,然后我们用产生对象的方法new 关键字 ,new了一个鸭子,然后将这个实例d,传进了method,然后将duck的age变成了5,然后再输出鸭子的年龄,结果是什么呢?肯定不是2了,如果是2引用传递就没有意义了和值传递不就一样了吗啊哈哈哈!最后的结果是5,为啥呢?看我再给你分析一波!先来一张艺术品画图
示例三:String传递
public class RefDemo2{
public static void main(String[] args){
String name = “小飞”;
method(name) ;
System.out.println(“name=”+name) ;
}
public static void method(String sname){
sname = “小备”;
}
}
示例三的结果为啥输出的是小飞呢?字符串不是引用类型的变量吗?what,我们继续看内存结构
示例四:String传递
public class RefDemo3{
public static void main(String[] args){
Person p = new Person();
method(p) ;
System.out.println(“person name= ”+p.name) ;
}
public static void method(Person p ){
p.name = “备备”;
}
}
class Person{
String name = “飞飞”; //省略封装
}
这次如果让我猜的话 应该就是备备了,为啥是备备了呢?接着上图