zoukankan      html  css  js  c++  java
  • JAVA中的按值传递

    Java中只有按值传递,没有按引用传递!

    方法参数共有两种类型:

    • 基本数据类型
    • 对象引用

    一:基本数据类型

    首先看一个小例子:

     1 package chuandi;
     2 
     3 public class Test1 {
     4     public static void main(String[] args) {
     5         int x=8;
     6         change(x);
     7         System.out.println(x);
     8     }
     9     public static void change(int b){
    10         b=b*2;
    11     }
    12 }

    如果按引用传递,那么得到的值应该是:16 ,但是答案却是

    可以看到x的值并没有发生变化;

    过程是这样的:

    1. b被初始化为x值的一个拷贝,即8
    2. b乘以2后等于16。但是x没有变化,依然是8
    3. change执行完后,参数变量不再使用

    x作为参数传递给change()方法时,是将内存空间中x所指向的那个存储单元中存放的值,即"8",传送给了change()方法中的b变量,而这个b变量也在内存空间中分配了一个存储单元,这个时候,就把x的值8传送给了这个存储单元中。此后,在change()方法中对b的一切操作都是针对b所指向的这个存储单元,与x所指向的那个存储单元没有关系了!

    自然,在函数调用之后,x所指向的存储单元的值还是没有发生变化,这就是所谓的“值传递”!值传递的精髓是:传递的是存储单元中的内容,而非地址或者引用!

     

     二:对象引用

     1 package chuandi;
     2 
     3 public class Test2 {
     4     public static String name = "hello";  
     5     public void change(Test2 t){
     6         t.name="hi";
     7     }
     8     
     9     public static void main(String[] args) {
    10         Test2 t=new Test2();
    11         System.out.println(t.name);
    12         t.change(t);
    13         System.out.println(t.name);
    14     }
    15 }

     

    那么既然是按值传递,为什么还能改变对象里面的值???请看下面;

     运行流程:

       首先在main方法中我们新建了Test的对象,(理解堆栈了后面是容易理解的),实际Test对象被创建在堆中,在栈中又创建Test类型的t,这是一个句柄,里面存放的是Test对象在堆中的实际位置;然后运行到change()方法,我们将t这个参数传进方法,t里面存放的是实际Test的位置,也就是Test存储单元,也就是说在change()方法中对t的一切操作都是针对t所指向的这个存储单元;(t所指向的那个存储单元中的内容是实体对象的地址,使得t也指向了该实体对象,所以才能改变对象内部的属性!这也是我们大多数人会误以为是“引用传递”的终极原因!!!)回顾一下上面的一个值传递的例子,值传递,就是将存储单元中的内容传给调用函数中的那个参数,这里是不是异曲同工,是所谓“值传递”,而非“引用传递”!!!

  • 相关阅读:
    递归函数及Java范例
    笔记本的硬盘坏了
    “References to generic type List should be parameterized”
    配置管理软件(configuration management software)介绍
    WinCE文件目录定制及内存调整
    使用Silverlight for Embedded开发绚丽的界面(3)
    wince国际化语言支持
    Eclipse IDE for Java EE Developers 与Eclipse Classic 区别
    WinCE Heartbeat Message的实现
    使用Silverlight for Embedded开发绚丽的界面(2)
  • 原文地址:https://www.cnblogs.com/GH0522/p/8279221.html
Copyright © 2011-2022 走看看