zoukankan      html  css  js  c++  java
  • JAVA值传递和引用传递

    JAVA值传递和引用传递

    @Author: TianchiLiu

    1 值传递和引用传递

    • 值传递:

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


      基本类型都是值传递


    • 引用传递:


      也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方 法中相对应的形式参数,函数接收的是原始值的内存地址。在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象。


      对象和数组是引用传递


    2 总结:java语言中只有值传递,没有引用传递

    • 无论传递的是值本身还是地址,传入方法的参数都是原始值的一个copy,而对这 个形式参数的操作都不会影响原本值(无论是值还是地址)
    public class Test1 {
     
    	static class a{
     
    	}
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int i = 1;
    		System.out.println("基本类型数据传入方法前:"+i);//基本类型数据传入方法前:1
    		change(i);
    		System.out.println("基本类型数据传入方法后:"+i);//基本类型数据传入方法后:1
    		
    		a a1 = new a();
    		System.out.println("对象类型数据传入方法前:"+a1);//对象类型数据传入方法前:对象等号.Test1$a@2a139a55
    		changea(a1);
    		System.out.println("对象类型数据传入方法后:"+a1);//对象类型数据传入方法后:对象等号.Test1$a@2a139a55
    		
    		int shuzu[] = new int[2];
    		System.out.println("数组传入方法前:"+shuzu);//数组传入方法前:[I@6d06d69c
    		changeshuzu(shuzu);
    		System.out.println("数组传入方法后:"+shuzu);//数组传入方法后:[I@6d06d69c
     
    	}
     
    	private static void changeshuzu(int[] shuzu) {
    		// TODO Auto-generated method stub
    		shuzu = new int[3];
    		System.out.println("数组传入方法中:"+shuzu);
    	}
     
    	private static void changea(a a1) {
    		// TODO Auto-generated method stub
    		a1 = new a();
    		System.out.println("对象类型数据传入方法中:"+a1);//对象类型数据传入方法中:对象等号.Test1$a@15db9742
    	}
     
    	private static void change(int i) {
    		// TODO Auto-generated method stub
    		i = 100;
    		System.out.println("基本类型数据传入方法中:"+i);//基本类型数据传入方法中:100
    	}
     
    }
    
    • 对象和数组,传入方法的时候都是,传入自身地址的一个copy,改变这个copy,自然不会对原来自身的地址值有变化;但是如果改变这个copy里的值,自然会影响原来地址里面的值
    /*
     * 传入方法之前i:15
    传入方法之后i:20
    传入方法之前数组内容:1,2,3
    传入方法之后数组内容:10,20,30*/
    public class Test2 {
     
    	static class b{
    		int i = 15;
    		
    	}
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		b b1 = new b();
    		System.out.println("传入方法之前i:"+b1.i);
    		changeb(b1);
    		System.out.println("传入方法之后i:"+b1.i);
    		
    		int shuzu[] = {1,2,3};
    		System.out.println("传入方法之前数组内容:"+shuzu[0]+","+shuzu[1]+","+shuzu[2]);
    		changeshuzu(shuzu);
    		System.out.println("传入方法之后数组内容:"+shuzu[0]+","+shuzu[1]+","+shuzu[2]);
    	}
     
    	private static void changeshuzu(int[] shuzu) {
    		// TODO Auto-generated method stub
    		shuzu[0] = 10;
    		shuzu[1] = 20;
    		shuzu[2] = 30;
    	}
     
    	private static void changeb(b b1) {
    		// TODO Auto-generated method stub
    		b1.i = 20;
    	}
     
    }
    
    • String ,Integer ,Double 虽然也是类,但是设计成不可变(immutable)类,可以当做传递值本身的值传递
    /*
    public class Test3 {
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		String a = "a1";
    		System.out.println("传入方法前:"+a);//传入方法前:a1
    		changestring(a);
    		System.out.println("传入方法后:"+a);//传入方法后:a1
    		
    		Integer a1 = 1;
    		System.out.println("传入方法前:"+a1);//传入方法前:1
    		changeInteger(a1);
    		System.out.println("传入方法后:"+a1);//传入方法后:1
    	}
    	private static void changeInteger(Integer a1) {
    		// TODO Auto-generated method stub
    		a1 =100;
    	}
    	private static void changestring(String a) {
    		// TODO Auto-generated method stub
    		a = "a2";
    	}
    }
    

    参考:obession

  • 相关阅读:
    (转载)构建public APIs与CORS
    SpringMVC 参数注入
    java删除文件夹
    idea 自动提示生成 serialVersionUID
    JSP自定义tag
    gradle中使用嵌入式(embedded) tomcat, debug 启动
    spring in action 4th --- quick start
    Date, TimeZone, MongoDB, java中date的时区问题
    spring boot 添加拦截器
    HTTP status code
  • 原文地址:https://www.cnblogs.com/TianchiLiu/p/9856244.html
Copyright © 2011-2022 走看看