Java中传参数--值传递和引用传递

**

Java中传参数–值传递和引用传递

**
在Java中,传参数分为值传递引用传递

在Java中的数据类型分为两大类:一类是引用类型,也叫类类型(除了String以外的所有复合数据类型,包括数组、类和接口),是指通过类创建的对象的变量名字,这种类型在传递的时候就要遵守“引用传递”的规则;另一种是原始类型,即为8大基本类型(字节型(byte),短整形(short),整型(int),长整型(long),字符型(char),浮点型(float),双精度(double),布尔型(boolean)),这类型的数据在调用的时候传递时遵守 “值传递” 规则的。

接下来,就分别来介绍一下值传递引用传递它们是如何进行参数传递的

一、值传递

值传递:是指方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数的改变不影响实际参数的值。
首先,可以来看一段代码:

package com.yf1020;

public class Student {
    
    
	public void changeInt(int t) {
    
    
		t=100;
		System.out.println("这里t的值是:" +t);
	}
}

这里先创建了一个Student类,在该类中有有一个改变t的值的方法。
然后我们再来创建对象,调用其中的方法,代码如下:

package com.yf1020;

public class Manager {
    
    
/*
 * 程序运行的入口点
 * */
	public static void main(String[] arg) {
    
    
		//创建对象
		Student st = new Student();
		int i = 1000;
		//调用方法 在changeInt中改变i的值
		st.changeInt(i);
		System.out.println("这里i的值是:" +i);
	}

输出结果:
在这里插入图片描述

通过输出结果,我们就可以去证明方法changeInt中所改变的t与i没有关系,方法中对t的改变,不会影响到调用代码中i的值。我们其实也可以这样理解,就是先看主类中的主程序,当设置i为1000时,继而将i的值传入到方法changeInt中,这样就改变了方法changeInt中的t的值,但是这不会影响在主类中i的值,仅仅是改变那个方法changeInt中的t值而已。

二、引用传递

引用传递: 也称传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
在理解引用传递之前,先明白何为引用,代码如下:

//创建对象,这里的test1类名是随意命名的,没有什么具体意义的
		Student st = new Student();

这段代码可以描述为: 首先声明一个Student类型的变量st,再将这个st变量名指向一个新建的Student对象。st变量是这个新建对象的名字----并不是对象数据本身!!!例如你是一个学生对象,且叫“学生甲”,当我们使用“学生甲”这个名字的时候,“引用”的就是你,但是你的实体与“学生甲”这个名字不是同一个东西,你们之间称作“学生甲”,这个名字引用了你这个对象。

看一个代码例子就马上明白了,如下:
Student类:

package com.yf1020;

public class Student {
    
    
	private String name;
	public void setName(String t) {
    
    
		name = t;
	}
	public String getName() {
    
    
		return name;   
	}
}

主类:

package com.yf1020;

public class temp {
    
    
	public static void main(String[] arg) {
    
    
		//创建对象
		Student st1 = new Student();
		st1.setName("第一个");
		Student st2 = new Student();
		st2.setName("第二个");
		Student st3 = new Student();
		st3.setName("第三个");
		
		//进行交换
		st1 = st2; //将st2的引用值赋给st1;
		st2 = st3; //将st3的引用赋值给st2;
		st3 = st1; //因为上面已经把st2赋给了st1,此时st1内的引用值是之前st2内的值,所以这个时候相当于将最开始st2的值赋给了st3了。
		
		String name1 = st1.getName();
		String name2 = st2.getName();
		String name3 = st3.getName();
		System.out.println(name1);
		System.out.println(name2);
		System.out.println(name3);
	}
}

输出的结果:
在这里插入图片描述
从最终的结果我们可以看出,st3变量名,最终指向了st2对象,即名字值被赋为“第二个”的对象。
同样地,在方法调用时,如果方法的参数是引用类型,传入的则只是一个对象名字的引用,而不是这个对象的本身!!!代码如下:

package com.yf1020;

public class Teacher {
    
    
	public void changeST(Student st) {
    
    
		String newName = "改名字";
		st.setName(newName);
	}
	public static void main(String[] arg) {
    
    
		//创建对象
		Student st1 = new Student();
		//调用前,设定学生的名字
		st1.setName("第一个");
		Teacher te = new Teacher();
		//传入对象引用名:
		te.changeST(st1);
		String name = st1.getName();
		System.out.println("调用后st1的名字其实是:"+name);
	}
}

输出结果:
在这里插入图片描述
通过看输出的结果值,我们知道在te对象的changeST方法中改变了原来的值,即在调用时,main方法中的st1和changeST中的st变量名,都是指向的同一个Student对象!!!

猜你喜欢

转载自blog.csdn.net/qq_39350172/article/details/109199257