这是一个Java的经典问题,大部分人从C,C++语言入门,C语言有三种传递方式:值传递,地址传递和引用传递。详细的对C语言指针,引用的我个人的理解,见链接

Java所有操作都是传值操作!都是传值操作!都是传值操作!重要的事情说三遍。

疑问?那为什么别人讲的时候都是说,java的基本数据类型都是传值,所有的自定义数据(类的对象)都是传引用??

很简单,因为这样好理解,意思是说:“同学们,如果我们把一个基本数据类型的值(变量)传递给一个函数的形参,那么无论我们对这个变量怎么操作,函数运行完之后,并不会改变这个变量的值!(到这里都是对的)但是如果我们把一个类的实例(对象)作为参数传递给函数,那么我们在函数里面对这个对象的改变,会实际地改变这个对象的值!(这里就不完全正确了)”。

对于Java的对象与引用的理解,请参见:浅谈Java中的对象和引用。我这里简单说一下Person person = new Person("张三"),这里面new Person("张三")是类Person的实例(或者说是对象),person是这个实例(对象)的引用。

Java的参数传递都是值传递!!!

先贴一篇博文:理解Java中的引用传递和值传递,如果你觉得这个人讲的很有道理,那么你是麻瓜(哇!马老师附体!)。我先不解释,去看下这篇博文的1楼评论!

我们先定义,什么是值传递,什么是引用传递。

值传递:方法调用时,实际参数把它的值的副本传递给对应的形式参数。特点:此时内存中存在两个相等的基本类型,即实际参数和形式参数后面方法中的操作都是对形参这个值的修改,不影响实际参数的值

引用传递:方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址;特点:在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象

值传递实在是太简单了,大家应该都容易理解,既然传递的是实际参数的副本,那么更改这个副本,跟原来的变量没有一点关系。

但是对于引用传递,一般的支持引用的例子我也不说了。看一个稍微特殊的例子:如果我们把下面的例子理解为引用传递,输出应该是: LI Si 才对!因为zhangsan这个(new Person("ZHANG San")的)引用指向了新的对象!但实际结果是zhangsan这个引用指向的对象的名字并没有变!

 public class ValueOrRef {
public static void main(String[] args) {
Person zhangsan = new Person("ZHANG San");
changePerson(zhangsan);
zhangsan.printName();
}
public static void changePerson(Person person){
person = new Person("LI Si");
}
} class Person {
String name = "default";
public Person(String name) {
this.name = name;
}
public void changeName(String name){
this.name = name;
}
void printName() {
System.out.println(this.name);
}
}

所以这里,我们把这种传递也理解为”值传递“只不过这里的值,是一个”引用”的值!也就是我们把实际参数(一个引用)拷贝一份赋值给形式参数,形式参数进行操作。当形式参数对本身的对象进行了变动操作,这里的效果跟引用传递是相同的。但是一旦给形式参数进行赋值类型的操作,这个赋值操作并不会像C语言的引用那样,把这个赋值的效果反映在函数运行结束之后!!

总结:不要纠结与值传递与引用传递的概念了,我们明白函数执行的过程就好了!为了更好地理解整个运行过程的变化,请参考:Java:按值传递还是按引用传递详细解说(其中有图片演示,很清楚)。

Java:传值还是传引用?的更多相关文章

  1. java传值与传引用

    一.传值与传引用 1.不管java参数的类型是什么,一律传递参数的副本. 在thinking in java中,明确指出,如果java是传值,那么传递的是值的副本,如果java传递的是引用,那么传递的 ...

  2. java传值和传引用区别

    1. 在java中所有的参数都是传值的,引用符号&的传递是C++中才有的:2. 在java传参中,基本类型(byte--short--int--long--float--double--boo ...

  3. Java : 传值or传引用?

    那看看这句经典名言:O'Reilly's Java in a Nutshell by David Flanagan (see Resources) puts it best: "Java m ...

  4. java传值与传引用总结

    基本数据类型 我们先来看一个代码 public class ParamTest { public static void main(String[] arge) { double percent = ...

  5. java关于传值与传引用

    关于java传值还是传引用的问题经常出现在一些烦人的面试题中,主要考察个人对java基础的掌握情况. 首先明确一下:本地方法中,java的参数传递都是传值.但是如果是远程调用方法时,会将对象本身传递过 ...

  6. java集合中的传值和传引用

    在学习java集合过程中发现了传值和传引用的区别: 我们来看下面两句话 ●java集合就像一种容器,我们可以把多个对象(实际上是对象的引用),丢进该容器.(来自疯狂java讲义) ●当使用Iterat ...

  7. java中的传值与传引用

    java函数中的传值和传引用问题一直是个比较“邪门”的问题,其实java函数中的参数都是传递值的,所不同的是对于基本数据类型传递的是参数的一份拷贝,对于类类型传递的是该类参数的引用的拷贝,当在函数体中 ...

  8. Java中传值与传引用

    不管Java参数类型是什么,一律传递参数的副本. <Thinking In Java>:“When you're passing primitives into a method,you ...

  9. java 函数形参传值和传引用的区别

    java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清. (一)基本数据类型:传值,方法不会改变实参的值. public class TestFun { public static v ...

  10. Java内存管理-Stackoverflow问答-Java是传值还是传引用?(十一)

    勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 本文导图: 一.由一个提问引发的思考 在Stack Overflow 看到这样一个问题 ...

随机推荐

  1. SQL优化原则(转)

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统 ...

  2. 【P2P浏览器】跟大家讨论一个想法

    内容分享者通过这个浏览器来创建自己待分享的内容 任谁看了这些内容,就会在本地保存一份,成为一个节点只要任一个节点在线,别人就能看这些内容在线的节点越多,获取这些内容的速度越快 任何使用这个浏览器的人, ...

  3. 设计模式教程(Design Patterns Tutorial)笔记之一 创建型模式(Creational Patterns)

    目录 · 概述 · Factory · What is the Factory Design Pattern? · Sample Code · Abstract Factory · What is t ...

  4. [转] can not find module @angular/animations/browser

    本文转自:https://blog.csdn.net/yaerfeng/article/details/68956298 angularjs4升级了,原来的animations现在被单独出来一个包. ...

  5. Java框架之Struts2(三)

    一.几种国际化输出方式 国际化:国际化的本质,就是查找,替换.程序界面上输出的是国际化消息的 key 所对应的值.Struts2 中的国际化机制,会根据 key 到资源文件中找对应的文本来替换上面的k ...

  6. Java基础——Ajax(一)

    学习之前举一个简单的小栗子,让我们简单了解一下Ajax的应用与好处.一般网站都会有自己的数据库,用来单独存储用户的个人信息,平时我们在注册账号的时候会遇到信息输入的页面,假设第一个输入信息是用户名的填 ...

  7. Java入门 第10天 ,理解数组

    数组的特点: 1.内容的类型固定,不会int String 两个类型一起,要么是int类型 要么是String类型 或者其他类型. 2.长度是固定的,例:String [ ]   myArray  = ...

  8. Java集合之HashSet源码分析

    概述 HashSet是基于HashMap来实现的, 底层采用HashMap的key来保存数据, 借此实现元素不重复, 因此HashSet的实现比较简单, 基本上的都是直接调用底层HashMap的相关方 ...

  9. 站在DevOps肩膀上的TestOps(二)

    一十一 发表于 2018-03-14 16:40:22 TestOps   摘要: TestOps模型旨在将整个团队的注意力集中在质量上,因此TestOps确实需要无缝且可靠. 一个简单的例子是任何测 ...

  10. Mybatis逆向工程生成po、mapper接口、mapper.xml

    Mybatis逆向工程生成po.mapper接口.mapper.xml 一.新建一个maven工程 请查看我的另一篇博客:<使用idea创建一个maven工程> 二.引入所需依赖 需要my ...