java 改变形参时 形参是基本数据类型(包括String)则不影响原本的值 其余情况会影响

JAVA八种基本数据类型

字符类型 char 布尔类型boolean 数值类型byte、short、int、long、float、double
一个特殊类型String

经验证八种基本数据类型以及对应的包装类以及String类型不会被形参的值改变而影响本身的值。

代码

import java.util.List;
import java.util.ArrayList;

class Solution {
	public void test(int a){
		a=2;
	}
	public void test(int[] a){
		a[0]=5;
		a[1]=5;
	}
	public void test(ArrayList a){
		a.clear();
		a.add(new Integer(5));
	}
	public void test(Integer a){
		a=15;
	}
	public void test(String a){
		a="改变了";
	}
	public void test(animal a){
		a.ans=10;
	}
	
    public static void main(String[] args) {
		Solution a=new Solution();
		
		int exam1=1;
		a.test(exam1);
		System.out.println("int类型测试:"+exam1);
		
		int[] exam2={1,2};
		a.test(exam2);
		System.out.println("int数组类型测试:"+exam2[0]+" "+exam2[1]);
		
		ArrayList<Integer> exam3=new ArrayList<>();
		exam3.add(new Integer(1));
		a.test(exam3);
		System.out.println("List测试:"+exam3.get(0));
		
		Integer exam4=new Integer(1);
		a.test(exam4);
		System.out.println("Integer包装类测试:"+exam4);
		
		String exam5="未改变";
		a.test(exam5);
		System.out.println("String类型测试:"+exam5);
		
		animal exam6=new animal(1);
		a.test(exam6);
		System.out.println("自定义类型测试:"+exam6.ans);
	}
    
    
    //自定义类型测试
    public static class animal{
    	int ans;
    	public animal(int ans){
    		this.ans=ans;
    	}
    }
}

结果

int类型测试:1
int数组类型测试:5 5
List测试:5
Integer包装类测试:1
String类型测试:未改变
自定义类型测试:10

原因

基本类型:值存放在局部变量表中,无论如何修改只会修改当前栈帧的值,方法执行结束对方法外不会做任何改变;此时需要改变外层的变量,必须返回主动赋值。

引用数据类型:指针存放在局部变量表中,调用方法的时候,副本引用压栈,赋值仅改变副本的引用。但是如果直接改变副本引用的值,修改了引用地址的对象,此时方法以外的引用此地址对象当然被修改。

其实就相当于基本数据类型和String传入的其实是一个副本,所以改变形参对原本值无影响。而其余类型包括自定义类型传入的其实是一个引用,形参改变,实参跟着改变。

发布了15 篇原创文章 · 获赞 0 · 访问量 182

猜你喜欢

转载自blog.csdn.net/qq_36360463/article/details/103979790