Java当中其实都是值传递?

在Java中值传递和引用传递是不同的,怎么个不同法呢?他们在内存当中的结构是怎么样的咱们经过四个示例,来给你们说道说道,java

示例一:值传递 spa

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呢。3d

由于基本数据类型的变量是存在栈内存的,因此method入栈,而后传值的时候,是把x复制一份传给mx,而后method方法mx变成20,是复制品变成了20,然而x仍是10.其实Java当中都是值传递,为何要分值传递和引用传递呢?接着往下看code

示例二:引用传递
复制代码
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,为啥呢?看我再给你分析一波!先来一张艺术品画图cdn

由于呀这个duck是引用类型的数据,因此它在执行玩Duck d = new Duck()内存结构是栈内存里存的内存地址,堆内存里存的属性啥的,method方法执行的时候,它仍是复制了一份传进去,此次它复制的是栈内存里的地址,而后method方法改变的age,由于是同一个地址,因此d.age就被更改为了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,咱们继续看内存结构对象

because字符串自己就是个对象,方法传值的时候 和之前同样也是传的地址,不同的是sname="小备","小备"它就至关于建立了个对象,至关于new了一个对象,小飞和小备不是一个实例了,sname="小备"sname的指向就变成了小备,而name的指向仍是"小飞",这也是字符串一个特殊的地方

示例四: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 = “飞飞”;   //省略封装
}
复制代码

此次若是让我猜的话 应该就是备备了,为啥是备备了呢?接着上图blog

这个图仍是挺复杂的,一步一步的分析,先实例化一个Person p,栈内存里存的p的地址,堆里面存的是Person这个实例, 而后p里面的name它也是一个引用类型的变量因此name存的也是一个地址,而后它指向了"飞飞"这块地址为0x0055的内存,传给method的依然是0x0044这个地址,而后p.name="备备",name的指向由指向0x0044,指向了备备的内存地址0x0066,p的name的地址变了,加黑的那一句话!理解关键就是分析完毕!
相关文章
相关标签/搜索