java中的参数传递是按引用传递还是按值传递
最近去面试,有一个面试官问到java中参数传递的问题,感觉自己对于这一块还是理解的不够深。今天我们就一起来学习一下Java中的接口和抽象类。下面是本文的目录大纲:
一 . 什么是按值传递,什么是按引用传递
二 . java中的参数传递是按值传递还是按引用传递
三.总结
若有不正之处,请多多谅解并欢迎批评指正,不甚感激。
一 . 什么是按值传递,什么是按引用传递
按值调用(call by value) : 在参数传递过程中,形参和实参占用了两个完全不同的内存空间。形参所存储的内容是实参存储内容的一份拷贝。
按值传递在基本数据类型数据传递中比较好理解,测试代码如下:
public class test {
public static void main(String[] args) {
int age = 0;
System.out.println("before change age="+age);
change(age);
System.out.println("after change age="+age);
} public static void change(int a){
a=20;
}
}
运行结果:
before change age=0
after change age=0
这个结果相信很多朋友已经猜到:因为在main方法中调用change(age)时,真正传递给change方法的参数只是age的一个副本,所以修改这个副本,并不能修改原来age的值。
按引用调用:在参数传递的过程中,形参和实参完全是同一块内存空间,两者不分彼此。
例如:
main()
{
int a=;
func(&a);
printf("%d\n",a);
}
func(int *b)
{
*b=;
}
咳咳,这貌似是C语言的按引用传递。java的安引用传递写不出来。
二. java中的参数传递是按值传递还是按引用传递
在下结论之前,我们还是看一个例子:
public class PassByValue {
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "PassByValue [name=" + name + "]";
} public static void main(String[] args) {
PassByValue myDear = new PassByValue();
myDear.setName("dontKnow");
String mylove ="dontKnow";
int herAge=0;
System.out.println("myDear name="+myDear.getName());
System.out.println("myLove ="+mylove);
System.out.println(herAge);
stringChange(mylove,myDear,herAge);
System.out.println("============================================================");
System.out.println("myDear name="+myDear.getName())
System.out.println(mylove);
System.out.println(herAge)
} public static void stringChange(String a,PassByValue b,int age){
a="gaoshan";//这一句相当于a=new String("gaoshan")
b.setName("gaoshan");
age=20;
} }
运行结果如下:
myDear name=dontKnow
myLove =dontKnow
0
============================================================
myDear name=gaoshan
myLove =dontKnow
0
我们发现,myDear 中的name 属性通过stringChange()方法改变了,myLove的值并没有改变。
这里有一个疑问:myDear和mylove 都是引用数据类型,为什么myDear的属性值会改变,而mylove 没有改变呢?
其实原因在注释中已经说了:在stringChange方法中,a="gaoshan";这一句等价于a=new String("gaoshan"),实际上a作为数据引用发生了改变,指向了一个新的内存地址,而myDear作为数据引用,并没有发生改变,仍然指向main方法中myDear所指向的对象。
三.总结
在java中,不存在按引用调用,因为在参数传递过程中,不管传递的是基本数据类型的变量,还是对象的引用,其实都是传递的一个副本。
在上面的例子中,myDear 所指向的对象之所以会发生改变,是因为在stringChange方法中,通过myDear 的副本b对myDear 所指向的对象进行操作,改变了对象属性,但是
myDear 本身作为对象引用并没有发生改变。而myLove 没有发生改变是因为在stringChange方法中直接改变了myLove 副本a的值,并没有对myLove 所指向的对象进行修改,所以我们看到 main方法中的myLove所指向的对象并没有发生改变
本文参考
java参数传递(超经典):http://blog.sina.com.cn/s/blog_4b622a8e0100c1bo.html
java中的参数传递是按引用传递还是按值传递的更多相关文章
- Java中的参数传递 --Java
1.基本类型传值,对象类型传地址 按值传递:当将一个参数传递给一个方法时,方法接收的是原始值的一个副本.因此,如果方法修改了该参数,仅改变副本,而原始值保持不变. 按引用传递:当将一个参数传递给一个方 ...
- java中的参数传递——值传递、引用传递
参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递. 在 Java 应用程序中永远不会传递对象,而只传递对象引用.因此是按引用传递对象.Java 应用程序按引用 ...
- java中的参数传递
Java中只有传值调用(值传递),没有传址调用(址传递或者引用传递).所以在java方法中改变参数的值是不会改变原变量的值的,但为什么改变引用变量的属性值却可以呢?请看下面的解答. java中的数据类 ...
- java中参数传递--值传递,引用传递
java中的参数传递——值传递.引用传递 参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递. 在 Java 应用程序中永远不会传递对象,而只传递对象引用. ...
- java中方法的参数传递机制
问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个 ...
- 【Java基础】12、java中方法的参数传递机制
问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个 ...
- 如何理解Java中参数传递只能传值?
以前学习C#的时候,是完全在工作岗位上学习,一些底层较为深入的道理都不是很清楚.如今学习了Java,对于Java参数传递只能传值,不能传引用(指针)感到很困惑,在C#中不是常常说把某个引用传递到函数中 ...
- 关于java中是引用传递还是值传递的问题!!!经常在笔试中遇到,今天终于弄明白了!
关于JAVA中参数传递问题有两种,一种是按值传递(如果是基本类型),另一种是按引用传递(如果是對象).首先以两个例子开始:1)public class Test2 { public static vo ...
- 关于java中是引用传递还是值传递的问题
关于JAVA中参数传递问题有两种,一种是按值传递(如果是基本类型),另一种是按引用传递(如果是對象).首先以两个例子开始:1)public class Test2 { public static vo ...
随机推荐
- 微信小程序支付及退款流程详解
微信小程序的支付和退款流程 近期在做微信小程序时,涉及到了小程序的支付和退款流程,所以也大概的将这方面的东西看了一个遍,就在这篇博客里总结一下. 首先说明一下,微信小程序支付的主要逻辑集中在后端,前端 ...
- buttongroup中content一次性加载的解决方法
buttongroup一次性加载所有内容的解决方法 如下图所示: 第一步: 设置windowcontainer的autoLoad属性为false(默认情况下autoLoad属性为true,所以会加载所 ...
- SpringCloud学习笔记(3)——Hystrix
参考Spring Cloud官方文档第13.14.15章 13. Circuit Breaker: Hystrix Clients Netflix提供了一个叫Hystrix的类库,它实现了断路器模式. ...
- 理解OC“属性”这一概念
1.定义一个属性,编译器会自动编写相关的存取方法和实例变量,如果不想使用系统默认的实例变量,可以使用@synthesize(合成)语法来指实例变量的名字,如果不想编译器自动合成存取方法,则可以自己实现 ...
- Python入门 - 容器类型
python的容器有四种:列表List,元祖Tuple,字典Dictionary和集合Set. 一.列表List a = [1, 2, 3, 'a', 'b', 'c'] b = 1.5 a.appe ...
- 【转】Cmder--Windows下命令行利器
原文链接:https://www.cnblogs.com/zqzjs/archive/2016/12/19/6188605.html cmder cmder是一个增强型命令行工具,不仅可以使用wind ...
- MySQL服务找不到了,navicat打不开数据库连接
今天打开Navicat看看连接名,突然发现连接不上了,打开服务发现MySQL服务不见了,所以手动安装了遍MySQL服务. 详细步骤如下: 1.管理员身份打开cmd,切换到MySQL安装目录下的bin目 ...
- poj 2456 Aggressive cows && nyoj 疯牛 最大化最小值 二分
poj 2456 Aggressive cows && nyoj 疯牛 最大化最小值 二分 题目链接: nyoj : http://acm.nyist.net/JudgeOnline/ ...
- 通过反射实现Microsoft Visual Studio International Pack 1.0 SR1里面的两个类
这两天打算实现拼音和简繁转换的方法, 发现Microsoft Visual Studio International Pack 1.0 SR1 提供了 . 下载地址 但是基于某些原因, 一来下载 ...
- always中的敏感变量
always语句下如果有判断语句if,那么if语句中的条件必须有always中的敏感变量. 否则错误提示为:Error (10200): Verilog HDL Conditional Stateme ...