【java】的传值方式

当你问大多数程序员Java是传值还是传引用的时候,你可能会得到两种答案之一:

(1)Java传递原始类型数据时使用的是传值方式;传递对象时则使用传引用方式;String类型的数据采用的是传值方式,因为字符串是不可变的。(2)Java传递所有参数都使用传值方式

只有第二个答案是正确的。理解传值和传引用的区别的关键是要记住,当你向一个方法传递一个对象时,Java没有把对象放入堆栈,它只是拷贝对象的引用然后将这个引用的拷贝放入堆栈。也就是说,根据定义,Java使用的是传值方式。

证明
如果Java通过传引用方式传递对象,那么执行下面的代码就会交换保存在两个变量a和b中的引用,而相应的输出应该如下:

a: 4
b: 100
Swapped!
a: 100
b: 4

其实真正的动作是在方法的参数o1和o2中的引用,它并不影响原始变量a和b。下面是其实际输出:

a: 4
b: 100
Swapped!
a: 4
b: 100

public class SwapTip {
public static void main(String []args) {
Integer a = new Integer(4);
Integer b = new Integer(100); System.out.println("a: " + a);
System.out.println("b: " + b); swap(a, b); System.out.println("Swapped!");
System.out.println("a: " + a);
System.out.println("b: " + b);
} public static void swap(Object o1, Object o2) {
Object t = o1;
o1 = o2;
o2 = t;
}
}

为什么说这个争论的答案是有意义的?
很多参与过争论传递参数的方式的程序员最后都会说:“只是语义不同而已”或者是“没有关系,因为都理解它真正的工作原理。”

对于有经验的程序员来说这可能是一个语义问题,但是对于那么没有什么经验的程序员来说,情况就不一样了。对于程序员来说一个语言的黑拿越少,他们在用那种语言写程序的时候就能做得越好。

一个类比

对象引用与实例的关系就像遥控器与电视机的关系,引用控制对象就像遥控器控制电视机一样。如果一个遥控器的复制品给了另一个人,那么那个人也可以控制电视机。复制的遥控器对电视机的动作(比如说调节音量、改换频道或者调节时钟)对于它本身和原装遥控器来说都是可见的。如果那个人改装了复制的遥控器去控制另外一台电视机,那么原来的遥控器不会受到影响。

诚然,Java是通过传值还是传引用的方式来传递参数只是一个学术上的区别,只要我们知道期望哪种行为即可。但是有时候知道台后的事情也是重要的。

Java只有一种参数传递方式,那就是传值。它简单、有文档可查并且确实是如此。

转自http://www.blogjava.net/zsh118/articles/24564.html

public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
int i = 5;
     System.out.println(a + "," + b + "," + i);
operate(a, b, i);
System.out.println(a + "," + b + "," + i);
}
public static void operate(StringBuffer x, StringBuffer y, int j) {
x.append(y);
y = x;
y.append("C");
j = 1;
}
}

运行结果:

A,B,5
ABC,B,5

规律总结:
Java参数,不管是原始类型还是引用类型,传递的都是副本
    如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值.
    如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是通过地址改变改变了地址指向的值,那么在函数内的改变会影响到传入的参数。
 
    如果在函数中改变了副本的地址,如当执行如a=其他对象,a=new等赋值操作时,实际上是将a指向新的位置,那么函数外的原值不改变。
 
转自:http://www.cnblogs.com/wangfeixiong/p/7158442.html

【java】的传值方式的更多相关文章

  1. java中传值方式的个人理解

    前言 这几天在整理java基础知识方面的内容,对于值传递还不是特别理解,于是查阅了一些资料和网上相关博客,自己进行了归纳总结,最后将其整理成了一篇博客. 值传递 值传递是指在调用函数时将实际参数复制一 ...

  2. java参数传值方式

     java参数有值类型和引用类型两种.所以java参数的传值也就从这两个方面分析. 从内存模型来说参数传递更为直观一些,这里涉及到两种类型的内存:栈内存(stack)和堆内存(heap).   基本类 ...

  3. Java方法 传值方式

    这个问题是面试的时候经常会问到的一道题吧?这次做项目的过程中,其中一个同学因为无用了,导致了一个bug,不过是在提测前啦!本来我想借着这次机会分享一下java方法传参的机制,但是经过几天的学习,了解, ...

  4. Java中的参数传值方式

    本文转载自 https://blog.csdn.net/SEU_Calvin/article/details/70089977 1.  你觉得下面程序会输出什么 public static void  ...

  5. java中传值及引伸深度克隆的思考(说白了Java只能传递对象指针)

    java中传值及引伸深度克隆的思考 大家都知道java中没有指针.难道java真的没有指针吗?句柄是什么?变量地址在哪里?没有地址的话简直不可想象! java中内存的分配方式有两种,一种是在堆中分配, ...

  6. 【转载】Java是传值还是传引用

    1. 简单类型是按值传递的 Java 方法的参数是简单类型的时候,是按值传递的 (pass by value).这一点我们可以通过一个简单的例子来说明: /* 例 1 */ /** * @(#) Te ...

  7. java 传参方式--值传递还是引用传递

    java 传参方式--值传递还是引用传递 参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递.写它是为了揭穿普遍存在的一种神话,即认为 Java 应用程序按引用 ...

  8. iOS 浅谈MVC设计模式及Controllers之间的传值方式

    1.简述你对MVC的理解? MVC是一种架构设计.它考虑了三种对象:Model(模型对象).View(试图对象).Controller(试图控制器) (1)模型:负责存储.定义.操作数据 (2)视图: ...

  9. 页面之间传值方式的总结,五种方式,通知,block,代理,单例,NSUERDEFALUT,

    首先代码拿上 1:单例 2:通知 3:代理 4:block方法 5:NSUSERDEFAULT(沙盒文件) 先是单例类: .h文件 @interface DataSource : NSObject @ ...

随机推荐

  1. 提取数据xpath,re,css

    XPATH (1)/ 逐层提取 (2)text() 提取标签下面的文本 (3)//标签名 提取所有的标签 (4)//标签名[num>=1] 提取相同标签名的兄弟节点. <tr class= ...

  2. laravel-admin后台框架基本使用

    建立控制器 在app/Admin/Controllers新建对应的控制器来管理某个数据表.控制器例子: <?php namespace App\Admin\Controllers; use En ...

  3. matlab 中figure的图像 抗锯齿

    linehandle = plot(xxxxxx); set( linehandle, 'linesmoothing', 'on' );

  4. Linux man学习

    5 man    man是manual的简写,Linux求助的工具    man  命令行,如 man  date 在我学习鸟哥私房菜的时候,也称man为man page  手册页入口:1 用户指令2 ...

  5. SpringCloud系列:前言

    准备写springcloud系列了,先吐槽下自己,之前准备把学到的东西写下来,都因为工作或自己太懒(主要还是懒),写了个开篇就GG了,这次springcloud一定会坚持写完.加油! 这里先说下我搭建 ...

  6. Hostapd初始化失败

    Hostapd hostapd 是一个用户态用于AP和认证服务器的守护进程.它实现了IEEE 802.11相关的接入管理,IEEE 802.1X/WPA/WPA2/EAP 认证, RADIUS客户端, ...

  7. 给oracle命令的参数赋值

    ''' <summary>    '''   给oracle命令的参数赋值    ''' </summary>    ''' <param name="cmd& ...

  8. HttpClient——ESP8266HTTPClient库

    针对Http请求操作的库,ESP8266HTTPClient库不属于ESP8266WiFi库的一部分,所以需要引入  #include <ESP8266HTTPClient.h> HTTP ...

  9. SpringCloud微服务面试题

    spring data是spring用于简化spring开发中数据访问操作的项目spring Dataspring Data为我们提供了使用统一的API来对数据访问层进行操作,这主要是Spring D ...

  10. 【NOIP2016提高A组模拟9.15】Math

    题目 分析 因为\((-1)^2=1\), 所以我们只用看\(\sum_{j=1}^md(i·j)\)的值模2的值就可以了. 易证,一个数x,只有当x是完全平方数时,d(x)才为奇数,否则为偶数. 那 ...