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

  • 相关阅读:
    poj 3321 Apple Tree
    hdu 1520 Anniversary party
    Light OJ 1089 Points in Segments (II)
    Timus 1018 Binary Apple Tree
    zoj 3299 Fall the Brick
    HFUT 1287 法默尔的农场
    Codeforces 159C String Manipulation 1.0
    GraphQL + React Apollo + React Hook 大型项目实战(32 个视频)
    使用 TypeScript & mocha & chai 写测试代码实战(17 个视频)
    GraphQL + React Apollo + React Hook + Express + Mongodb 大型前后端分离项目实战之后端(19 个视频)
  • 原文地址:https://www.cnblogs.com/TianchiLiu/p/9856244.html
Copyright © 2011-2022 走看看