Java总是在讨论是传递还是引用传递,Java没有像C语言那样拥有指针,在看到引用传递和值传递很多的解释之后,更相信引用传递和值传递归根到底都是值传递,只不过引用传递的时候看上去很高大上,其实是把变量的地址值,注意是地址值传递过去,赋值给其他的变量。

看一个值传递的例子:

package demo_pass;

public class ValuePass {
public static void main(String[] args) {
ValuePass v = new ValuePass();
int a=5;
v.test(a);
System.out.println("main中a的值:"+a);
} public void test(int a) {
a = 2;
System.out.println("test中a的值:"+a);
}
}

输出:

test中a的值:2
main中a的值:5

通过idea的debug查看各个变量的赋值情况:

在main方法中创建了一个对象,定义一个变量a并赋值5,这时候调用test方法,test方法传进去a,这时候传进去a的值是5,程序继续向下执行,

在执行到12行的时候,12行的代码还没有执行,也就是没有进行赋值操作的时候,传进来的a的值还是5,当执行完12行的时候a的值变成了2,如下图:

(这些变量的值也可以通过Expression和Watches看出)

总结出来就是,这两个值是两个互不相关的值,在程序执行到这里的时候a的值传递过来,遇到赋值语句就改变了,如果把test方法中的赋值语句注释掉,a的值还是5,他们两个值是两个独立的值,互不相关,自己负责到自己的区域。特点:传递的是值的拷贝,传递之后就互不相关。

引用传递:

package demo_pass;

public class ReferencePass {
public static void main(String[] args) {
ReferencePass rp = new ReferencePass();
T t = new T();
t.a = 4;
rp.test(t);
System.out.println("main方法中a的值:" + t.a);
} public void test(T t) {
t.a = 3;
System.out.println("test方法中a的值:"+t.a);
}
} class T {
public int a = 0;
}

执行结果:

test方法中a的值:3
main方法中a的值:3

看创建的对象t的地址值,以及传进test方法的地址值都是一样的,此时对象t中a的值是4

继续向下执行,我们看到在test方法中传递进去的对象t还是在main方法中创建的对象,在test方法中的小括号内只是声明了T,并没有创建对象,执行到test方法内的时候,对象t一直没有改变,在main方法中的赋值把a的值从创建对象初始化的时候的0变成了4,执行到test方法中,这个值又变成了3,也就是最开始指向4,后来把指向的内容换成了3,不再指向4,注意这个a一直是main方法中创建的对象t中的变量,所以,两个输出值都是3

只要在test方法中添加创建对象的语句,输出结果就会改变

package demo_pass;

public class ReferencePass {
public static void main(String[] args) {
ReferencePass rp = new ReferencePass();
T t = new T();
t.a = 4;
rp.test(t);
System.out.println("main方法中a的值:" + t.a);
}
public void test(T t) {
t = new T();
t.a = 3;
System.out.println("test方法中a的值:"+t.a);
}
} class T {
public int a = 0;
}

输出;

test方法中a的值:3
main方法中a的值:4

因为在test方法中创建了一个对象,这个对象是堆内存中一块新的区域,不是main方法中那个对象了,他们的变量没有任何的关系。

如有不对,欢迎指正!

Java值传递和引用传递的更多相关文章

  1. Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义

    一.Java中什么叫做引用类型变量?引用:就是按内存地址查询       比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...

  2. java中值传递和引用传递

    最近工作中使用到了值传递和引用传递,但是有点懵,现在看了下面的文章后清晰多了.一下是文章(网摘) 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...

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

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

  4. java的值传递和引用传递

    昨天博主在对于值传递和引用传递这里栽了一个大坑啊,导致一下午时间都浪费在这里,我们先说下值传递和引用传递java官方解释: 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对 ...

  5. java中方法的参数传递机制(值传递还是引用传递)

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

  6. java 对象传递 是 值传递 还是 引用传递?

    这个问题说实话我感觉没有太大的意义. 按第一印象和c++的一些思想去理解的话对象传递是引用传递,因为传递过去的对象的值能被改变. 但是又有很多人,不知道从哪里扣出来一句,java中只有值传递,没有引用 ...

  7. java参数传递时到底是值传递还是引用传递

    java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...

  8. Java面向对象-方法的值传递和引用传递

    Java面向对象-方法的值传递和引用传递 0 发布时间:『 2016-08-21 14:21』  博客类别:Java核心基础  阅读(197) 评论(0) Java面向对象-方法的值传递和引用传递 方 ...

  9. Does Java pass by reference or pass by value?(Java是值传递还是引用传递) - 总结

    这个话题一直是Java程序员的一个热议话题,争论不断,但是不论是你百度搜也好还是去看官方的文档中所标明的也好,得到的都只有一个结论:Java只有值传递. 在这里就不贴代码细致解释了,让我们来看看一些论 ...

随机推荐

  1. 科普 TLS 1.3—新特性与开启方式

    TLS 1.3 协议针对安全强化及效率提升等方面进行了大量修改,相继推出 20 多个草案版本,即将完成最终的标准化.标准完成后,OpenSSL 组织将推出 OpenSSL 1.1.1 版本,对 TLS ...

  2. AttributeError: 'TestLogin' object has no attribute 'driver' in Pycharm for python selenium

    自动化测试学习中的问题: 最近几天在写登陆测试,遇到一个问题,困惑我的几个小时......... 我各种百度,花费大量时间,才找到我的问题的根本所在,最终解决了我的问题,主要是大小写的问题def Se ...

  3. C++的AES加解密

    最近公司项目要做个WPF程序,但是底层加密部分要用C++来实现.通过网上搜索各种资料,地址已经记不下了,没发贴出来了! 下面看看如何加解密的~!先贴代码.... string tKey(sKey); ...

  4. SAS 9.4 的sid问题解决方案汇总(头疼...)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 因为经常出现sid出现问题,所以问题很多.最常 ...

  5. vxWorks BSP主要文件目录的组成及主要文件的作用

    vxWorks BSP主要文件目录的组成及主要文件的作用 1.目录target/config/All: 这个目录下的文件是所有BSP文件共享的,不是特别需要不要更改里面的任何文件. a.configA ...

  6. Failed while installing Dynamic Web Module 3.0

    1.错误描述 2.错误原因 Java Web项目不满足Web Module 3.0,需要降低Web Module版本 3.解决办法 (1)降低Web Module版本为2.5 (2)修改jdk版本,升 ...

  7. hdu5988 Coding Contest

    首先这是个费用流,用log转乘法为加法,外加模板的修改,需加eps 下面是废话,最好别看 闲来无事(鼓起勇气)写这篇博客 这是个自带影像回访的题目 青岛的炼铜之旅,大学的acm生涯就这样结束了.或许还 ...

  8. CentOS7.2编译安装PHP7.2.3之史上最详细步骤。

    首先,我们的CentOS版本信息如下: 开始我们的编译. 第一步: 将php安装包安装到/usr/src目录下. cd /usr/src && wget http://cn2.php. ...

  9. Codeforces Round #466 (Div. 2)

    所有的题目都可以在CodeForces上查看 中间看起来有很多场比赛我没有写了 其实是因为有题目没改完 因为我不想改,所以就没有写了(大部分题目还是改完了的) 我还是觉得如果是打了的比赛就一场一场写比 ...

  10. 【CJOJ P2110】YL杯超级篮球赛

    [CJOJ P2110]YL杯超级篮球赛 Description 一年一度的高一YL杯超级篮球赛开赛了.当然,所谓超级的意思是参赛人数可能多于5人.小三对这场篮球赛非常感兴趣,所以一场都没有落下.每天 ...