Java 参数传递都是值传递
Java 参数传递都是值传递,验证代码如下
public class ParamTransferTest {
public static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
System.out.println("swap() a = " + a + " b = " + b);
}
public static void swap(DataWrap dataWrap) {
int temp = dataWrap.a;
dataWrap.a = dataWrap.b;
dataWrap.b = temp;
System.out.println("swap() datawrap = " + dataWrap + " Field a = " + dataWrap.a + " Field b = " + dataWrap.b);
}
public static void newObject(DataWrap dataWrap) {
dataWrap = new DataWrap();
System.out.println("newObject() datawrap = " + dataWrap + " Field a = " + dataWrap.a + " Field b = " + dataWrap.b);
}
public static void destoryObject(DataWrap dataWrap) {
dataWrap = null;
System.out.println("destoryObject() datawrap = " + dataWrap);
}
public static void swapObject(DataWrap a, DataWrap b){
System.out.println("in swap before a = " + a + " b = " + b);
DataWrap temp = a;
a = b;
b = temp;
System.out.println("in swap after a = " + a + " b = " + b);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//1.PrimitiveTransferTest
int a = 6;
int b = 9;
System.out.println("before swap, a = " + a + " b = " + b);
swap(a, b);
System.out.println("after swap, a = " + a + " b = " + b);
//2.RefTransferTest
DataWrap dataWrap = new DataWrap();
dataWrap.a = a;
dataWrap.b = b;
System.out.println("before swap, dataWrap = " + dataWrap + " Field a = " + dataWrap.a + " Field b = " + dataWrap.b);
swap(dataWrap);
System.out.println("after swap, dataWrap = " + dataWrap + " Field a = " + dataWrap.a + " Field b = " + dataWrap.b);
//3.in method create new object
System.out.println("before newObject, dataWrap = " + dataWrap + " Field a = " + dataWrap.a + " Field b = " + dataWrap.b);
newObject(dataWrap);
System.out.println("after newObject, dataWrap = " + dataWrap + " Field a = " + dataWrap.a + " Field b = " + dataWrap.b);
//4.in method destory object
System.out.println("before destoryObject, dataWrap = " + dataWrap + " Field a = " + dataWrap.a + " Field b = " + dataWrap.b);
destoryObject(dataWrap);
System.out.println("after destoryObject, dataWrap = " + dataWrap + " Field a = " + dataWrap.a + " Field b = " + dataWrap.b);
//5.swap object
DataWrap dataWrapA = new DataWrap();
DataWrap dataWrapB = new DataWrap();
System.out.println("before swap, dataWrapA: " + dataWrapA + " dataWrapB = = " + dataWrapB);
swapObject(dataWrapA, dataWrapB);
System.out.println("after swap, dataWrapA: " + dataWrapA + " dataWrapB: " +dataWrapB);
}
}
DataWrap.java
public class DataWrap {
public int a;
public int b;
}
运行结果:
before swap, a = 6 b = 9
swap() a = 9 b = 6
after swap, a = 6 b = 9
before swap, dataWrap = DataWrap@659e0bfd Field a = 6 Field b = 9
swap() datawrap = DataWrap@659e0bfd Field a = 9 Field b = 6
after swap, dataWrap = DataWrap@659e0bfd Field a = 9 Field b = 6
before newObject, dataWrap = DataWrap@659e0bfd Field a = 9 Field b = 6
newObject() datawrap = DataWrap@2a139a55 Field a = 0 Field b = 0
after newObject, dataWrap = DataWrap@659e0bfd Field a = 9 Field b = 6
before destoryObject, dataWrap = DataWrap@659e0bfd Field a = 9 Field b = 6
destoryObject() datawrap = null
after destoryObject, dataWrap = DataWrap@659e0bfd Field a = 9 Field b = 6
before swap, dataWrapA: DataWrap@15db9742 dataWrapB = = DataWrap@6d06d69c
in swap before a = DataWrap@15db9742 b = DataWrap@6d06d69c
in swap after a = DataWrap@6d06d69c b = DataWrap@15db9742
after swap, dataWrapA: DataWrap@15db9742 dataWrapB: DataWrap@6d06d69c
如上,简单数据类型就不多说了。让人疑惑的往往是在参数是引用的时候。
由代码中验证的第3.4.5.步可以看出实际上参数类型是引用的时候,也是值传递。在函数内部栈会创建自己的指向原引用对象的引用,所以传引用的时候,修改对象本身,执行完函数后,对象本身确实发生了变化。而如果只是修改引用本身,并不会对传入的引用造成影响,因为在函数内部修改的引用只是局部的。
Java 参数传递都是值传递的更多相关文章
- java参数传递------真心是值传递
未完待续 不同意的请尽管去深入看一下. 对象是引用传递没错,参数传递是值传递.
- java都是值传递,没有引用传递
博主这几天在复习 javaSE 部分的内容时,遇到了关于参数传值的问题,但是始终不知道原因,上网上一查才知道钻牛角尖了,把C语言的参数传值转移到java中了. 相信很多在学习java之前,有接触过C/ ...
- java 传参方式--值传递还是引用传递
java 传参方式--值传递还是引用传递 参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递.写它是为了揭穿普遍存在的一种神话,即认为 Java 应用程序按引用 ...
- Java中到底是值传递还是引用传递?
Java中到底是值传递还是引用传递? 我们先回顾一下基本概念 实参和形参 参数在编程语言中是执行程序需要的数据,这个数据一般保存在变量中.在Java中定义一个方法时,可以定义一些参数, 举个例子: p ...
- Java中真的只有值传递么?
Java中真的只有值传递么? (本文非引战或diss,只是说出自己的理解,欢迎摆正心态观看或探讨) 回顾值传递和引用传递 关于Java是值传递还是引用传递,网上有不一样的说法. 1.基本类型或基本类型 ...
- 面试题:Java中为什么只有值传递?
作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功.JAVA底层.面试相关资料等更多精彩文章在公众号「小牛呼噜噜 」 目录 经典的问题 形参&实参 Java是 ...
- Java面向对象-方法的值传递和引用传递
Java面向对象-方法的值传递和引用传递 0 发布时间:『 2016-08-21 14:21』 博客类别:Java核心基础 阅读(197) 评论(0) Java面向对象-方法的值传递和引用传递 方 ...
- Java中只有按值传递,没有按引用传递!(两种参数情况下都是值传递)
今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这 ...
- java中方法的参数传递机制(值传递还是引用传递)
看到一个java面试题: 问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参 ...
随机推荐
- 菜鸟学Windows Phone 8开发(4)——设置应用程序样式
本系列文章来源MSDN的 面向完全新手的 Windows Phone 8 开发 本文地址:http://channel9.msdn.com/Series/Windows-Phone-8-Develo ...
- ruby -- 问题解决(七)ActionController::InvalidAuthenticityToken解决办法
学习链接:http://cnkerry.iteye.com/blog/350718 解决方法一: class FooController < ApplicationController prot ...
- 关于全局唯一ID生成方法
引:最近业务开发过程中需要涉及到全局唯一ID生成.之前零零总总的收集过一些相关资料,特此整理以便后用 本博客已经迁移至:http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...
- Appium移动自动化测试(二)--安装Android开发环境
继续Appium环境的搭建. 第二节 安装Android开发环境 如果你的环境是MAC那么可以直接跳过这一节.就像我们在用Selenium进行web自动化测试的时候一样,我们需要一个浏览器来执行测试 ...
- "浅谈Android"第二篇:活动(Activity)
距离上一篇文章,过去有半个多月了,在此期间忙于工作,疏于整理和总结,特此写下这篇博文,来谈谈自己对Activity的理解.总所周知,Activity组件在Android中的重要性不言而喻,我们 ...
- CentOS6.5菜鸟之旅:识别NTFS分区
一.前言 CentOS默认时不能识别NTFS分区的,需要那么需要安装fuse-ntfs-3g来处理了. 二.安装fuse-ntfs-3g yum install fuse-ntfs-3g
- 利用DropDownList实现下拉
在视图的Model<Vo>里面我们需要使用IEnumerable来将别的列表的数据全部的转化为下拉列表.下面是关于在项目中实际的写法. 一:实现下拉属性列表的写法 通过使用Select ...
- Winform开发的界面处理优化
在Winform开发中,客户体验是个很好的参考性指标,如果一个功能使用的时候感觉很流畅,说明我们的程序执行效率还不错,但是随着数据的真多,原先可能流程的地方可能会变得比较卡,这时候就需要追本索源,找到 ...
- [CLR via C#]18. Attribute
attribute可以说是Microsoft .NET Framework提出的最具创意的技术之一了.利用attribute,可以声明性的为自己的代码构造添加注解,从而实现一些特殊的功能.attrib ...
- Aspose.Words.Tables.Row类操作word表格行
http://www.aspose.com/docs/display/wordsnet/Aspose.Words.Tables.Row+Class Retrieves the index of a r ...