Java的参数传递是「按值传递」还是「按引用传递」?
JAVA传递的只有值,.传递的都是栈里的的值,只是有些栈里面的是值.有的是内存地址.(原文传递的都是栈里的的值有误,局部变量在栈中,成员变量在堆中,类变量(静态变量和常量)在方法区中,可以看做本文的变量都是main方法下的变量)
基本类型的栈 是它的本身. 传递时.传递的是本身的副本.所以对副本修改原响不了本身
引用类型的栈 是一个内存地址.传递时..传递的是内存地址的副本..原内存地址与副本都指向同一内存. 所以.修改副本指向内存的内容时.会影响到原内存地址指向的内存
基本类型进行传递的时候是值的 副本,基本类型的副本是一个栈(栈内存里存的是基本类型的本身),所以对栈的副本进行修改不会影响原件
引用类型进行传递的时候是值的 副本,引用类型的副本是一个内存地址(栈),所以副本和原件都是都指向同一块内存堆空间
对象的传递

这里. 对象的传递.
例如.对象1的两部份.内存地址--A 内存--a
对象2 = 对象1 那么对象2的两部份是 内存地址--A副本 内存a
它们只是传递了栈里的内存地址.
对象1与2 是共用一个内存空间的.而不是对象2重新开辟一个同样大小的空间.. 你修改A副本,直接影响到 内存a
就好像一个银行账户.取钱方式有一本存折,一张银行卡..无论你用哪种方式取钱.都会影响到账户余额.
所以这不是"引用传递". 只是内存地址的值的传递.
举例说明:
class cType{
public value;
}
void fun(cType cobj){
cobj.value = 10;
}
2.首先声明对象:cType c = new cType();
调用函数:fun(c);
调用函数返回之后,对象c的value值为10。(看起来像是传递引用的效果,实际传的是栈中内存地址的值,见下面方法中再new一个对象的例子,就知道传的不是引用)
当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是「按值传递」还是「按引用传递」?
答:是按值传递。Java 语言的参数传递只有「按值传递」。当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法内改变,但对象的引用(不是引用的副本) 是永远不会改变的。
Java的参数传递,不管是基本数据类型还是引用类型的参数,都是按值传递,没有按引用传递!
我们可以看一下microsoft的文档中对按引用传递参数的定义(如下截图):

1、基本数据类型的参数
先来看一下基本数据类型的参数按值传递的例子:
TransferTest.java

public class TransferTest {
public static void main(String[] args) {
int num = 1;
System.out.println("changeNum()方法调用之前:num = " + num);
changeNum(num);
System.out.println("changeNum()方法调用之后:num = " + num);
}
public static void changeNum(int x) {
x = 2;
}
}

运行结果:

这个传递过程的示意图如下:

num作为参数传递给changeNum()方法时,是将内存空间中num所指向的那个存储单元中存放的值1传递给了changeNum()方法中的x变量,而这个x变量也在内存空间中分配了一个存储单元,这个时候,就把num的值1传递给了x的这个存储单元中。此后,在changeNum()方法中对x的一切操作都是针对x所指向的这个存储单元,与num所指向的那个存储单元没有关系了!
所以,在changeNum()方法调用之后,num所指向的存储单元的值还是没有发生变化,这就是所谓的“按值传递”!按值传递的精髓是:传递的是存储单元中的内容,而不是存储单元的引用!
2、引用类型的参数
同样,先看一个例子:
TransferTest2.java

1 public class TransferTest2 {
2 public static void main(String[] args) {
3 Person p1 = new Person();
4 System.out.println(p1);
5 change(p1);
6 System.out.println(p1);
7 }
8
9 public static void change(Person p2) {
10 p2 = new Person();
11 }
12 }
13
14 /**
15 * Person类
16 */
17 class Person {
18
19 }

运行结果:

可以看出两次打印person的地址值是一样的,即调用完change() 方法之后,person变量并没有发生改变。
这个传递过程的示意图如下:

当执行到第3行代码时,程序在堆内存中开辟了一块内存空间用来存储Person类的实例对象,同时在栈内存中开辟了一个存储单元用来存储该实例对象的引用,即上图中person指向的存储单元。
当执行到第5行代码时,person作为参数传递给change()方法,需要注意的是:person将自己存储单元的内容传递给了change()方法的p变量!此后,在change()方法中对p的一切操作都是针对p所指向的存储单元,与person所指向的那个存储单元没有关系了!
https://www.cnblogs.com/nnngu/p/8299724.html
Java的参数传递是「按值传递」还是「按引用传递」?的更多相关文章
- Java中参数传递时值传递的机制分析
参数传递是什么? 在C的函数或是JAVA的方法中,向一个函数或方法内部传递一个参数,比如: void fun( int num ){ num+=2 ; } int a = 3 ...
- Java的参数传递是「值传递」还是「引用传递」?
关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题. 有人说Java中只有值传递,也有人说值传递和引用传递都是存在的,比较容易让人产生疑问. 关于值传递和引用传递其实需要分情况看待. ...
- Java的参数传递是值传递还是引用传递
当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是值传递还是引用传递? 答:是值传递.Java 语言的参数传递只有值传递.当一个对象实例作为一个参数被传递到方法中 ...
- 「BUAA OO Unit 4 HW16」第四单元总结与课程回顾
「BUAA OO Unit 4 HW16」第四单元总结与课程回顾 目录 「BUAA OO Unit 4 HW16」第四单元总结与课程回顾 Part 0 第四单元作业架构设计 架构设计概要 AppRun ...
- Java方法的参数是按值传递的.【转】
在Java中,所有的方法参数,都是"按值传递". 有那么一种说法,Java中基本类型是按值传递,对象是按引用传递.这个说法其实是不确切的,确切的说法是 Java中基本类型将值作为参 ...
- 「七天自制PHP框架」第四天:模型关联
往期回顾:「七天自制PHP框架」第三天:PHP实现的设计模式,点击此处 原文地址:http://www.cnblogs.com/sweng/p/6624845.html,欢迎关注:编程老头 前阵子在网 ...
- SpringBoot图文教程15—项目异常怎么办?「跳转404错误页面」「全局异常捕获」
有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1-Spr ...
- 「给产品经理讲JVM」:垃圾收集算法
纠结的我,给我的JVM系列终于起了第三个名字,害,我真是太难了.从 JVM 到 每日五分钟,玩转 JVM 再到现在的给产品经理讲 JVM ,虽然内容为王,但是标题可以让更多的人看到我的文章,所以,历经 ...
- 「BUAA OO Unit 1 HW1」面向测试小白的简易评测机
「BUAA OO Unit 1 HW1」面向测试小白的简易评测机 声明:本评测机所使用数据生成来自郭鸿宇同学,这对本评测机非常重要 目录 「BUAA OO Unit 1 HW1」面向测试小白的简易评测 ...
随机推荐
- PAT 1006 换个格式输出整数
https://pintia.cn/problem-sets/994805260223102976/problems/994805318855278592 让我们用字母B来表示“百”.字母S表示“十” ...
- Delphi处理Http请求自定义Header
在HTTP请求中,get方法是默认的,但在URL地址长度是有限的,请求方法能传送的数据也是有限的,一般get方法传递的数据不能大于2KB,当get请求方法传递的数据长度不能满足需求时,就需要采用另一种 ...
- 微信小程序不能超过十个并发的解决办法
一般是封装一个请求队列,将请求对象存入队列,在complete写队列的出队操作.
- HashMap, HashTable,HashSet,TreeMap 的时间复杂度
hashSet,hashtable,hashMap 都是基于散列函数, 时间复杂度 O(1) 但是如果太差的话是O(n) TreeSet==>O(log(n))==> 基于树的搜索,只需要 ...
- html 類 class
為html元素設置類,相同的類使用相同的樣式.一般元素都能使用,可以在<div>和<span>中使用,同一個class可以被個<div>或<span>使 ...
- python 从filelist.txt中拷贝文件到另一文件夹中
#! python #coding:utf-8 ##!/usr/bin/python # Filename : fileCp.py import sys import os import shutil ...
- Django的ORM常用查询操作总结(Django编程-3)
Django的ORM常用查询操作总结(Django编程-3) 示例:一个Student model: class Student(models.Model): name=models.CharFiel ...
- 七牛云注册创建oss并配置自定义域名
1.登陆官网注册账号 有个人和企业两种,根据自己的情况进行注册 https://portal.qiniu.com/signup/choice 2.注册后要进行认证,不认证是没有免费空间给你使用的 3. ...
- JSP 和 Servlet 的工作原理和生命周期
JSP的英文名叫Java Server Pages,翻译为中文是Java服务器页面的意思,其底层就是一个简化的Servlet设计,是由sum公司主导参与建立的一种动态网页技术标准.Servlet 就是 ...
- 【BZOJ5019】[SNOI2017]遗失的答案(FWT,动态规划)
[BZOJ5019][SNOI2017]遗失的答案(FWT,动态规划) 题面 BZOJ 题解 发现\(10^8\)最多分解为不超过\(8\)个本质不同质数的乘积. 而\(gcd\)和\(lcm\)分别 ...