java中传参问题的分析,基本数据类型和引用类型传参的区别,String类型传参是值传递还是引用传递?

本文深入解析Java中的值传递机制,对比基本数据类型与引用数据类型的参数传递方式,并通过实例演示如何仅通过值传递来实现对象状态的修改。

java中没有引用传递,只有值传递

分析:java有基本数据类型和引用数据类型两种,基本数据类型变量存储的就是数值,而引用数据类型变量存储的是引用,也就是能指向堆中对象的地址

为什么说java只要值传递呢?

对于基本数据类型,传参传递的就是数值的副本,也就说把实参的数据复制给形参一份,不管形参怎么改变,实参是不受影响的

对于引用数据类型,传参传递的是引用的副本,也就说把引用(对象的地址)复制了一份,这时候实参和形参都是引用(是两个引用,指向相同,区分C语言指针传递,一个对象指针只有一个,实参和形参是一个指针),都指向在堆中相同的对象

对形参引用两种操作的区别

  • 1把形参引用指向一个新对象

              这时改变的只是形参引用的指向,而实参引用和实参引用指向的对象都没有被改变

  •  2通过形参引用找到指向的对象,并对该对象修改

             因为实参引用和形参引用指向的对象相同,这是实参引用指向的对象被修改了

具体测试代码

传参基本数据类型

        

引用数据类型

           1把形参引用指向一个新对象

        public void setInt(Integer b) {
		b = new Integer(2);
		System.out.println("b的值为:"+b);
	}
	
	public static void main(String[] args) {
		Integer a = 1;
		Test1 t = new Test1();
		
		t.setInt(a);
		System.out.println("a的值为:"+a);
		

                //没有改变a的值
		/*
		 * 输出 
		 * b的值为:2 
		 * a的值为:1
		 */

	}
        //String类的直接赋值就相当于新创建另一个对象(但还是区别直接new的,可以这样理解)
        public void setString(String s2) {
		s2 = "bb";
		System.out.println("s2的值为:"+s2);
	}
	
	public static void main(String[] args) {
		String s1 = "aa";
		
		//调用setString()方法,试图修改s1的值
		Test t = new Test();
		t.setString(s1);
		
		System.out.println("s1的值为:"+s1);
	}
	
        //没有改变s1的值
	/*
	 * 输出 
	 * s1的值为:aa 
	 * s2的值为:bb
	 */

2通过形参引用找到指向的对象,并对该对象修改

	public void setArray(int[] b) {
		b[0] = 4;
		System.out.println("b数组:"+b[0]+b[1]+b[2]);
	}
	
	public static void main(String[] args) {
		int[] a = {1,2,3};
		
		Test2 t = new Test2();
		t.setArray(a);
		
		System.out.println("a数组:"+a[0]+a[1]+a[2]);
	}
	
	//a数组的值发生了改变
	/*
	 * 输出 
	 * 423 
	 * 423
	 */
	

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值