java 参数的传递 值传递与引用传递

sancaiodm Java 2021-11-27 1245 0

值传递:指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

值传递:

方法调用时,实际参数把它的值传递给对应的形式参数,函数接收的是原始值的一个copy,此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值


引用传递:是指在调用函数时将实际参数的地址直接传递到函数中(的形参),那么在函数中对参数所进行的修改,将影响到实际参数。

引用传递:

也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址;

在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象。


关于值传递和引用传递可以得出这样的结论:

(1)基本数据类型传值,对形参的修改不会影响实参;

(2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;

(3)String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。


示例代码:

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int valueArg = 100;
	    List<String> ObejctArg = new ArrayList<>();
	    System.out.println("begin :"+valueArg);
	    confirmValueArg(valueArg);
	    System.out.println("after :"+valueArg);
	    System.out.println("begin :"+ObejctArg);
	    confirmObjectArg(ObejctArg);
	    System.out.println("end :"+ObejctArg);
	    User user = new JavaTestMain().new User();
	    System.out.println("begin username ="+user.name);
	    modifyUsername(user);
	    System.out.println("after username ="+user.name);
	}
	
	 static void confirmValueArg(int i) {
		i = i+ 100;
	}

	 static void confirmObjectArg(List list) {
		list.add("androidodm");
	}
	 
	 static void modifyUsername (User user) {
		 user.name = "newname";
	 }
	 
     class User{
    	 private String name = "androidodm";
    	 
    	 public void setUserName(String username) {
    		 name = username;
    	 }
    	 
    	 public String getUserName() {
    		 return name;
    	 }
     }
}

image.png

评论