一、传递类型

  我们从c语言开始学习程序设计语言时就知道,参数的传递类型一般有两种:值传递和引用传递。那么什么是值传递什么是引用传递呢? 值传递:指在调用方法时将实际参数的值拷贝一份传递给方法,这样方法在修改参数的值时就不会影响到实际的值。 引用传递:指将实际参数的引用地址直接传递给方法中,这样在方法中如果通过该地址修改数据会影响到实际地址的值。 值传递和引用传递最大区别在于是否进行了拷贝。显而易见,如果没有进行拷贝则方法中对参数的操作肯定会影响到实际的值;但是进行了拷贝就一定不会影响实际值了吗? 接下来就要说说Java中的传递机制了。

  二、Java传递机制

  Java中普通数据类型的传递机制是值传递。下面我们通过几段代码进行说明。

package com.ring2.parameter;

public class ValueTransfer {

    private static int i = 5;

    public static void test(int j) {
j = 10;
System.out.println("j = "+j);
} public static void main(String[] args) {
ValueTransfer.test(i);
System.out.println("i = " +i);
}
}

  下面是运行结果:

  从结果上可以看出在对基本数据类型进行操作测试时是没有影响到实际的值的,故这里采用了值传递的机制。下面我们再看看传递引用类型会是什么结果:

package com.ring2.parameter;

public class ReferenceTransfer {

    public static void test(Ring2 ring2) {
ring2.setName("ring3"); } public static void main(String[] args) { Ring2 ring2 = new Ring2();
System.out.println(ring2.getName());
ReferenceTransfer.test(ring2);
System.out.println(ring2.getName());
} }
class Ring2 {
private String name = "ring2"; public void setName(String name) {
this.name = name;
} public String getName() {
return this.name;
}
}

  以下是运行结果:

  可以看到,这里通过传递的参数改变了实际地址的值。那么Java到底是怎样的传递机制呢?是基本数据类型进行值传递,引用类型进行过引用传递吗?接下来我们再看看下一个例子就知道了:

package com.ring2.parameter;

public class ReferenceTransfer {

    public static void test(Ring2 ring2) {
ring2 = new Ring2(); //仅仅多出了这一行
ring2.setName("ring3"); } public static void main(String[] args) { Ring2 ring2 = new Ring2();
System.out.println(ring2.getName());
ReferenceTransfer.test(ring2);
System.out.println(ring2.getName());
} }
class Ring2 {
private String name = "ring2"; public void setName(String name) {
this.name = name;
} public String getName() {
return this.name;
}
}

  

  这段代码和上一段相比仅仅是加了一行代码,ring2 = new Ring2();   那么这一行代码能说明什么问题呢? 我们可以这样思考,如果Java采用的是基本类型值传递,引用类型引用传递;那么这时应该采用的是引用传递,引用传递不拷贝值,那么执行 ring2 = new Ring2() 这段代码,会把ring2重新引用到堆中新创建的Ring2类型的对象引用。那么就应该改变name为ring3,而结果却不是这样的,结果显示还是为ring2。 下面我来说说为什么如此: Java中采用的是值传递机制,会将实参的值拷贝一份给方法,而实参类型如果是引用类型同样也会拷贝实参的引用地址到方法中。所以说,Java中其实还是值传递的,只不过对于对象参数,值的内容是对象的引用。

  总结:

首先Java中所采用的方法传递机制为:值传递
无论方法的形参中是基本数据类型还是引用类型,都会在调用方法时将实参的值拷贝一份给形参。
而区别在于基本数据类型是将值拷贝一份,在方法体内修改不会影响实参的值;而将引用类型的值是将引用进行拷贝,我们知道引用是指向的堆空间中的对象,通过这个引用我们可以修改对象中的属性如:person.age = 5;则person的年龄就变成了5,但是如果像这样:person = new Person();则是新建一个Persion对象,然后将Person对象的地址赋值给拷贝而来的person引用。同理:如果做过一些笔试题则会看到如果将String、Integer等这样的引用类型在方法体内做了改变如:str = “hello”;实参中的str并不会改变。这是因为这种做法相当于person = new Person()
; 会将“hello”字符串指向形参中的str。没错:这也是一个赋值语句,将右边的“hello"字符串赋值给”复制“来的str引用。所以实参中的str并不会改变。

Java基础之值传递的更多相关文章

  1. JAVA中只有值传递

    今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这 ...

  2. 死磕面试系列,Java到底是值传递还是引用传递?

    Java到底是值传递还是引用传递? 这虽然是一个老生常谈的问题,但是对于没有深入研究过这块,或者Java基础不牢的同学,还是很难回答得让人满意. 可能很多同学能够很轻松的背出JVM.分布式事务.高并发 ...

  3. Java 中的值传递和参数传递

    Java中没有指针,所以也没有引用传递了,仅仅有值传递不过可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements 接口实现多继承的功能 值传递:方法调用时,实际参数 ...

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

    这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...

  5. java是通过值传递,也就是通过拷贝传递——通过方法操作不同类型的变量加深理解(勿删)

    head first java里写到“java是通过值传递的,也就是通过拷贝传递”,由此得出结论,方法无法改变调用方传入的参数.该怎么理解呢? 看例子: public class Test1 { pu ...

  6. Java中的值传递

    1.先比较下字符串的比较 == 代表全等于 值和地址(存放地址) 全部相等于. equals 值等于== 和 equals的区别 列如下面的 如果name1==name2是等于的 然而name1==n ...

  7. 为什么说Java中只有值传递

    本文转载自公众号 Hollis 对于初学者来说,要想把这个问题回答正确,是比较难的.在第二天整理答案的时候,我发现我竟然无法通过简单的语言把这个事情描述的很容易理解,遗憾的是,我也没有在网上找到哪篇文 ...

  8. 一道笔试题来理顺Java中的值传递和引用传递

      题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = ...

  9. java中的值传递和引用传递有什么区别呀?

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

随机推荐

  1. js前端加密,php后端解密(crypto-js,openssl_decrypt)

    来源:https://blog.csdn.net/morninghapppy/article/details/79044026 案例:https://blog.csdn.net/zhihua_w/ar ...

  2. curl请求本地域名问题

    curl在本地虚拟机上请求本地接口时候,出现域名解析问题,换为ip即可,可用curl_error() 或者curl_errno来调试: vue单个文件在引入时候自己的逻辑js文件一定要放在html后引 ...

  3. Python爬虫之记录一次下载验证码的尝试

      好久没有写过爬虫的文章了,今天在尝试着做验证码相关的研究时,遇到了验证码的收集问题.   一般,验证码的加载都有着比较复杂的算法和加密在里边,但是笔者今天碰到的验证码却比较幸运,有迹可循.在此,给 ...

  4. java关于throw Exception的一个小秘密

    目录 简介 throw小诀窍 总结 java关于throw Exception的一个小秘密 简介 之前的文章我们讲到,在stream中处理异常,需要将checked exception转换为unche ...

  5. 【JAVA基础】03 Java语言基础

    前言:流程控制语句 什么是流程控制语句 流程控制语句:可以控制程序的执行流程. 流程控制语句的分类 顺序结构 选择结构 循环结构 执行流程: 从上往下,依次执行. 案例演示 输出几句话看效果即可 cl ...

  6. 使用Node.js的http-serve搭建本地服务器

    为什么要使用它? 首先,类似于vue-cli创建的项目,都能够实现浏览器中自动刷新,实时查看项目效果.其中的原理在于,webpack这样的工具启动了一个本地服务器,将本机当作一台服务器,这样在浏览器中 ...

  7. 华为设备RIP实施和理论详解

    1.路由协议基础 共同的目的:更新.维护和控制3层的路由 工作机制: RIP,封装在UDP这个协议上,端口号520(优先级100) OSPF,封装在IP层,协议号89(优先级,内部10,外部是150- ...

  8. App 抓包代理设置

    1.设置 Fiddler 打开 Fiddler,Tools  -->  Fiddler Options  -->  HTPS (配置完后记得要重启 Fiddler) 选中  "D ...

  9. c/c++获取硬盘序列号

    最近在接触软件注册模块,需要获取硬盘序列号来生成注册码. 硬盘序列号,英文名:Hard Disk Serial Number,该号是硬盘厂家为区别产品而设置的,是唯一的.网上搜索一下,发现获取硬盘序列 ...

  10. 2249: Altruistic Amphibians 01背包

    Description A set of frogs have accidentally fallen to the bottom of a large pit. Their only means o ...