JAVA中的按值传递
Java中只有按值传递,没有按引用传递!
方法参数共有两种类型:
- 基本数据类型
- 对象引用
一:基本数据类型
首先看一个小例子:
package chuandi; public class Test1 {
public static void main(String[] args) {
int x=8;
change(x);
System.out.println(x);
}
public static void change(int b){
b=b*2;
}
}
如果按引用传递,那么得到的值应该是:16 ,但是答案却是
可以看到x的值并没有发生变化;
过程是这样的:
- b被初始化为x值的一个拷贝,即8
- b乘以2后等于16。但是x没有变化,依然是8
- change执行完后,参数变量不再使用
x作为参数传递给change()方法时,是将内存空间中x所指向的那个存储单元中存放的值,即"8",传送给了change()方法中的b变量,而这个b变量也在内存空间中分配了一个存储单元,这个时候,就把x的值8传送给了这个存储单元中。此后,在change()方法中对b的一切操作都是针对b所指向的这个存储单元,与x所指向的那个存储单元没有关系了!
自然,在函数调用之后,x所指向的存储单元的值还是没有发生变化,这就是所谓的“值传递”!值传递的精髓是:传递的是存储单元中的内容,而非地址或者引用!
二:对象引用
package chuandi; public class Test2 {
public static String name = "hello";
public void change(Test2 t){
t.name="hi";
} public static void main(String[] args) {
Test2 t=new Test2();
System.out.println(t.name);
t.change(t);
System.out.println(t.name);
}
}
那么既然是按值传递,为什么还能改变对象里面的值???请看下面;
运行流程:
首先在main方法中我们新建了Test的对象,(理解堆栈了后面是容易理解的),实际Test对象被创建在堆中,在栈中又创建Test类型的t,这是一个句柄,里面存放的是Test对象在堆中的实际位置;然后运行到change()方法,我们将t这个参数传进方法,t里面存放的是实际Test的位置,也就是Test存储单元,也就是说在change()方法中对t的一切操作都是针对t所指向的这个存储单元;(t所指向的那个存储单元中的内容是实体对象的地址,使得t也指向了该实体对象,所以才能改变对象内部的属性!这也是我们大多数人会误以为是“引用传递”的终极原因!!!)回顾一下上面的一个值传递的例子,值传递,就是将存储单元中的内容传给调用函数中的那个参数,这里是不是异曲同工,是所谓“值传递”,而非“引用传递”!!!
JAVA中的按值传递的更多相关文章
- Java中只有按值传递,没有按引用传递!
今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java ...
- 【转】Java中只有按值传递,没有按引用传递!
原文链接:http://guhanjie.iteye.com/blog/1683637 今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底 ...
- Java 中的按值传递
Java 中只有按值传递 "Java 中只有按值传递",初看到这几个字有点不敢相信,无数次通过函数改变过对象,无数次跟同事说 Java 在传对象的时候是按引用传递.后来细细想想,之 ...
- Java中只有按值传递,没有按引用传递!(两种参数情况下都是值传递)
今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这 ...
- java中数据的传递方式到底是怎样的!
今天早上我了一道有关java的题.主要考点是考java中值得传递方式. 之前我在javaoo里总结的是:基本数据类型中保存的是实际的值,引用数据类型保存的是被引用的内存地址,那么基本数据类型就是按值传 ...
- JAVA中只有值传递
今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这 ...
- Java中不得不谈的值传递和地址传递
个人的一些认识,希望能对初学Java的你,或者困惑于方法参数传递的你祈祷一丝帮助! 下面是一些作者的个人观点,如果有错,欢迎各位大牛指出错误,灰常感谢您的观看与支持... -------------- ...
- 你真的理解Java中的try/catch/finally吗?
看几个例子,回顾一下执行顺序 例子1 无异常,finally中的return会导致提前返回 public static String test() { try { System.o ...
- java中的参数传递是按引用传递还是按值传递
最近去面试,有一个面试官问到java中参数传递的问题,感觉自己对于这一块还是理解的不够深.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一 . 什么是按值传递,什么是按引用 ...
随机推荐
- C(8)
C语言位运算与文件 本章引言: 在不知不觉中我们的C高速入门系列已经慢慢地接近尾声了,而在这一节中,我们会对 C语言中的位运算和文件进行解析,相信这两章对于一些人来说是陌生的,由于非常多 老师都会跳过 ...
- hihoCoder_二分·归并排序之逆序对
一.题目 题目1 : 二分·归并排序之逆序对 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 在上一回.上上回以及上上上回里我们知道Nettle在玩<艦これ&g ...
- Python 安装 BeautifulSoup(Win7)
准备材料: 1.Win7,已安装的 Python3.4.1 2.BeautifulSoup4.3.2安装包 安装办法: 1.打开cmd 2,进入BeautifulSoup的解压文件夹 3,执行 pyt ...
- 项目实战13—企业级虚拟化Virtualization-KVM技术
项目实战系列,总架构图 http://www.cnblogs.com/along21/p/8000812.html KVM的介绍.准备工作和qemu-kvm 命令详解 1.介绍 (1)介绍 KVM:就 ...
- Linux查看系统信息(CentOS 7中测试通过)
以下命令运载CentOS7中测试通过 Linux查看服务器系统信息 CentOS版本 [root@blog ~]# cat /etc/os-release NAME="CentOS Linu ...
- HTTPS加密流程超详解(一)前期准备
0.前言 前一阵子想写一个HTTPS的嗅探工具,之前只是大致了解SSL/TLS协议的加密流程,真正上起手来一步一步分析发现还是有点复杂的,于是我参考了wireshark的源码以及各种RFC,弄清楚了S ...
- 如何修改maven默认仓库(即repository)的路径
如何修改maven默认仓库(即repository)的路径 1 在maven的安装目录下,修改Eclipse(或IntelliJ IDEA)的MAVEN的存储位置,点击Browser按钮,选择set ...
- Django学习(3)模板定制
在Django学习(一)一首情诗中,views.py中HTML被直接硬编码在代码之中,虽然这样便于解释视图是如何工作的,但直接将HTML硬编码到视图却不算一个好主意.因为: 对页面设计进行的任何改变都 ...
- Python 安装包的导入
1.安装适合的pip python安装pip的命令: python -m pip install --upgrade pip安装Python包,的确是pip最为方便了,简单快捷,因为它直接是从pypi ...
- 【JMeter】获取json响应报文中数组长度
import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.Predicate; import net.minidev.json.J ...