java 传递参数的两种方式

java 专栏收录该内容
72 篇文章 0 订阅

 

Java中没有指针,所以也没有引用传递了,仅仅有值传递不过可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements 接口实现多继承的功能

 

  值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。

  引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

 

       a.传递值的数据类型:八种基本数据类型和String(这样理解可以,但是事实上String也是传递的地址,只是string对象和其他对象是不同的,string对象是不能被改变的,内容改变就会产生新对象。那么StringBuffer就可以了,但只是改变其内容。不能改变外部变量所指向的内存地址)。
    b.传递地址值的数据类型:除String以外的所有复合数据类型,包括数组、类和接口 
值传递的例子:
package com.other.test;

public class Test {
	public static void change(int i, int j) { 
		int temp = i; 
		i = j; 
		j = temp;
	} 

	public static void main(String[] args) { 
		int a = 3; 
		int b = 4; 
		change(a, b); 
		System.out.println("a=" + a); 
		System.out.println("b=" + b);
	}
}


输出的结果是 a=3 b=4,传递的值并不会改变原值
 
引用传递的例子:(数组)
package com.other.test;

public class Test {
	public static void change(int[] counts) { 
		counts[0] = 6; 
		System.out.println(counts[0]);
	} 

	public static void main(String[] args) { 
		int[] count = { 1, 2, 3, 4, 5 }; 
		change(count);
		System.out.println(count[0]);
	} 
}

输出结果是6 6 也就是引用的值改变了原来的值
 
引用传递的例子:(对象)
 
定义一个A对象:
 
package com.other.test;

public class A {
	int i = 0;
}


对上边对象操作的类:

 

 

package com.other.test;

public class Test {
	public static void add(A a) { 
		//a = new A();   ①
		a.i++;
	} 

	public static void main(String args[]) { 
		A a = new A(); 
		add(a); 
		System.out.println(a.i );
	} 
}


当把①注解掉时,输出的结果是1,当①没有注解是是0,原因是 a =new A();构造了新的A对象就不是传递的那个对象了。

 

看看String的情况:

 

package com.other.test;

public class Test {
	String str = new String("old"); 
	char[] ch = { 'a', 'b', 'c' }; 
	public static void main(String args[]) { 
		Test ex = new Test(); 
		ex.change(ex.str, ex.ch); 
		System.out.print(ex.str + " and "); 
		System.out.println(ex.ch);
	} 

	public void change(String str, char ch[]) { 
		str = "new"; 
		ch[0] = 'd';
	}
}


输出的结果的是 old and dbc也就是传递String并不会改变原值,而是创建了一个新值。 ch[]就是一个简单的数组的传递。

 

( 对象包括对象引用即地址和对象的内容)

String 比较特别,看过String 代码的都知道, String 是 final的。所以值是不变的。 函数中String对象引用的副本指向了另外一个新String对象,而数组对象引用的副本没有改变,而是改变对象中数据的内容. 
  对于对象类型,也就是Object的子类,如果你在方法中修改了它的成员的值,那个修改是生效的,方法调用结束后,它的成员是新的值,但是如果你把它指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。 
  Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。 
  如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值.
  如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的地址,所以不会改变参数的值。

关注我,获取400个的赚钱金点子,轻松开启副业生涯

美团招聘,有意向的私信我

岗位名称:美团到家事业群-外卖技术部-JAVA高级工程师
职级要求:P2-3~P3-2

岗位职责:
- 负责上单业务系统的开发工作,深入理解业务痛点,通过技术手段满足并促进业务快速发展需要;
- 参与系统需求分析与设计,快速响应业务需求,负责完成核心代码编写,接口规范制定;
- 参与解决项目中的重难点问题,针对复杂业务模型能够给出合理的解决方案;

岗位基本要求:
- 参与过大型复杂分布式互联网系统的设计,要求有复杂业务的开发经验和较强的逻辑/概率思维能力,善于分析、归纳、描述、沟通和解决问题;
- 本科及以上学历,扎实的计算机基础,4年及以上工作经验,长期使用Java及开源框架进行项目开发,并有一定的项目管理经验;
- 深入使用Java,熟悉掌握常用的Java类库及框架,如多线程、并发处理、I/O与网络通讯等,对Java虚拟机有较深了解;
- 擅长使用开源框架,在某个领域内对开源框架有一定的审美,做过选型研究,解读过部分或者全部源码,掌握实现原理;
- 精通 MySQL 应用开发,熟悉数据库原理和常用性能优化技术,以及 NoSQL,Queue 的原理、使用场景以及限制;
- 研究过 http 协议、搜索引擎、缓存、jvm 调优、序列化、nio、RPC 调用框架等,并且有相关实践经验;
- 有强烈的责任心和团队合作精神,良好的抗压能力,心态积极,能主动融入团队;

具备以下者优先:
- 参与过相关系统建设;
- 有高并发系统经验;
- 参与过开源工作;
- 有代码洁癖、有极客精神;

相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值