转自:http://url.cn/5tL9F5D

值传递和引用传递

值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数,形参和实参总是指向同一个地址,形参指向哪里实参就会指向哪里。

java中的基本数据类型和引用数据类型

java中的基本数据类型:
  • 4种整数类型:byte、short、int、long

  • 2种浮点数类型:float、double

  • 1种字符类型:char

  • 1种布尔类型:boolean

java中的引用数据类型:
  • 接口

  • 数组

下面就对JAVA中传递参数是值传递还是引用传递展开讨论

下面先来看基本数据类型

下面先来看基本数据类型

public class Test {
static void testInt(int a, int b)
{
a=10;
b=20;
System。out。println("交换后 "+"a:"+a+", b:"+b);
}
public static void main(String[] args)
{
int a=1;
int b=2;
System。out。println("交换前 "+"a:"+a+", b:"+b);
testInt(a,b);
System。out。println("方法结束后"+"a:"+a+", b:"+b);
}
}

运行结果是这样的:

交换前:1  2

交换后:10  20

res  :  1  2

java中基本数据类型在传递的时候,用的是值传递,就是拷贝和实参一模一样的值然后由形参进行操作,当方法结束后,形参的生命周期就会终止,实参的值并没有受到影响。

下面来看引用数据类型

//  类的编写
class Car
{
public String name;
public Car()
{}
public Car(String name)
{
this。name=name;
}
}
下面进行测试 public class Test
{
public static void update1(Car car)
{
car。name="GTR";
System。out。println("修改后的名字是:"+car。name);
}
//这个方法比上面的方法多了一条a=new Car()语句
public static void update2(Car car)
{
car=new Car();
car。name="GTR";
System。out。println("修改后的名字是:"+car。name);
}
public static void main(String[] args)
{
Car a=new Car("AE86");
Car b=new Car("AE86");
System。out。println("调用update1前a的名字是:"+a。name);
update1(a);
System。out。println("调用update1后a的名字是:"+a。name);
System。out。println("调用update2前b的名字是:"+b。name);
update2(b);
System。out。println("调用update2后b的名字是:"+b。name); }
}

结果:

AE86

GTR

GTR

AE86

GTR

AE86

看完上面的update1方法,觉得引用数据类型和基本数据类型不一样,引用数据类型传入方法后,方法调用结束后对象的属性发生了变化,认为这是引用传递,将对象a的地址送到了形参中,然后对形参改变实参就会改变。

但是update2马上就推翻了这个想法,将实参送入形参后,形参马上在堆中新建了一个对象,如果是引用传递,那么此时形参和实参都是指向这个对象的,然后程序又对形参的name属性进行了修改,那么此时实参也会被修改,看到的结果就应该和update1一样。但是结果却不是这样的,并没有修改数据,这就说明了将对象作为实参传入方法的形参,并不是引用传递。

那么java中引用类型数据到底是怎么回事那,下面把自己的查阅资料理解的写下来。作为后续回顾。
Car b = new Car(“AE86”);

执行这个语句首先会在栈中创建一个b变量,然后在堆中创建一个Car类的实例,然后b指向堆中的实例。

其实在java程序中,将对象传入形参中,也是值传递,基本数据类型值传递就是拷贝一个变量的副本;下面以update2()分析,引用数据类型就是将变量名(b)指向堆的地址复制一份,也就是说在栈中有一个变量名(car)也指向堆中b的实例。

现在执行 car =new car();就是形参car指向了堆中一个新的地址,而b还是指向原来的地址的,这样的话,car随便修改name属性,是影响不到b的。最后方法结束car被释放,堆中的新对象被GC回收。

在update1()中可以修改是因为形参和实参指向同一块内容,当形参修改name属性,那么堆中的对象就会被修改,update1()执行结束后,car释放,但堆中的实例还有变量指向,不会被回收,这时就修改了b的值。

理解--->Java中的值传递&引用传递的更多相关文章

  1. 如何形象简单地理解java中只有值传递,而没有引用传递?

    首先,java中只有值传递,没有引用传递.可以说是"传递的引用(地址)",而不能说是"按引用传递". 按值传递意味着当将一个参数传递给一个函数时,函数接收的是原 ...

  2. 理解java中的值传递与“引用传递”

    额....java中其实没有引用传递 对于引用类型 ,在调用方法后,直接拷贝了引用的副本,但是它们指向了相同的堆地址,所以看起来像引用传递,但其实是值传递,只不过传递的引用的副本. 说一说为什么Str ...

  3. 在Java中字符串是通过引用传递的?

    这是一个经典的java问题.在stackoverflow上,许多类似的问题已经被问过了,但是许多回答是错误的或不完整的. 如果你不想深入思考的话,这个问题很简单.如果你想明白的更彻底,那么问题可能容易 ...

  4. 理解Java中的引用传递和值传递

    关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习 ...

  5. (转载)理解Java中的引用传递和值传递

      关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天 ...

  6. Java中的值传递与引用传递

    1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型. 基本类型的变量保存原始值,即它代表的值就是数值本身: 而引用类型 ...

  7. Java中的值传递和地址传递(传值、传引用)

    首先,不要纠结于 Pass By Value 和 Pass By Reference 的字面上的意义,否则很容易陷入所谓的“一切传引用其实本质上是传值”这种并不能解决问题无意义论战中.更何况,要想知道 ...

  8. java中的值传递和引用传递区别

    值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响 ...

  9. (转)Java中的值传递和引用传递

    Java中的值传递和引用传递 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?     答:是值传递.Java 编程语言只有值 ...

随机推荐

  1. day27-python阶段性复习-基础

    一.基础资料,安装python Python 跨平台的,(Linux,Windows,mac) 网站www.python.org 解释器交互方式 Ipython Python shell https: ...

  2. nginx配置文件详解(三)

    nginx配置文件详细解析 nginx安装目录:  /usr/local/nginx 配置文件:  /usr/local/nginx/conf 目录下的 nginx.conf文件 nginx优化方法1 ...

  3. 正则:img的url,width,height 和 a标签的url以及替换

    代码:// 内容:$detail['content'] //img的url,width,height $img = array(); $matches = array(); $regeImg = '/ ...

  4. 深入理解java虚拟机---虚拟机工具VisualVM(十九)

    性能分析神器VisualVM 9602 VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成 ...

  5. 单元测试模拟-moq

    1.moq 支持 net core 2.moq 通过一个接口类型 可以产生一个新的类 3.举例 //define interface to be mocked public interface ITe ...

  6. 关于ArrayList中的iterator返回的事迭代器实例问题。

    Arraylist是一个具体的类,它并没有定义它自己的iterator()方法,,它只是从AbstractList 这个抽象类中继承了iterator()这个方法,而AbstractList 中的it ...

  7. oracle 正则表达式 匹配

    oracle 正则表达式 在实际应用中,想排除带有中文的字段值: select h.froomnumber from t_broker_house h where REGEXP_LIKE(froomn ...

  8. position:sticky粘性布局

    新的布局方式,专门用于 tab栏悬浮效果: 当tab栏在可视区域时,正常滚动, tab栏不再可视区域时,悬浮置顶. position:-webkit-sticky; position:sticky; ...

  9. Beta阶段冲刺---Day3

    一.Daily Scrum Meeting照片 二.今天冲刺情况反馈 昨天已完成的工作: (1)数字以扑克牌的形式给出 (2)答案的乘除符号与游戏中的符号保持一致. 今天计划完成的工作 (1)闯关模式 ...

  10. 2019-03-11-day009-函数定义

    什么是函数 函数就是将许多冗余的代码进行整合统一调用的内存地址 函数怎么定义 def make(): print('掏出手机') print('打开微信') print('摇一摇') print('聊 ...