• Java 指针or引用?


    由一个问题引出:Java到底是传引用还是传值?

    如果是传引用,那么为何badSwap函数并没有如预想的那样交换变量?

     1 public void badSwap(int var1, int var2)
     2 
     3 {
     4 
     5     int temp = var1;
     6 
     7     var1 = var2;
     8 
     9     var2 = temp;
    10 
    11 }

    如果是传值,那么为何tricky函数能够改变外部变量的值?

     1 public void tricky(Point arg1, Point arg2)
     2 
     3 {
     4 
     5     arg1.x = 100;
     6 
     7     arg1.y = 100;
     8 
     9     Point temp = arg1;
    10 
    11     arg1 = arg2;
    12 
    13     arg2 = temp;
    14 
    15 }
    16 
    17 public static void main(String [] args)
    18 
    19 {
    20 
    21     Point pnt1 = new Point(0,0);
    22 
    23     Point pnt2 = new Point(0,0);
    24 
    25     System.out.println("X: " + pnt1.x + " Y: " +pnt1.y);
    26 
    27     System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);
    28 
    29     System.out.println(" ");
    30 
    31     tricky(pnt1,pnt2);
    32 
    33     System.out.println("X: " + pnt1.x + " Y:" + pnt1.y);
    34 
    35     System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);
    36 
    37 }

    从以上两个例子我们可以看出,传向函数的引用实际上是原始引用的副本(Java复制并传递了“引用”的值)。因此,方法中对对象成员变量的修改会生效,但因为方法中的引用时原始引用的副本,所以对象交换就没有起作用。

    其实,Java中所谓的引用和C++中引用的概念并不一样。C++中引用初始化后不可以修改(作为某个对象永久的别名),而Java中的引用可以指向其他的对象。至此,或许更好理解的一种方式是将Java中的“引用”理解为更加友好的但退化了的指针。友好是指在其使用时可以和指针一样操纵对象值,退化指的是不存在指针操作。总而言之,Java中的引用是对程序员来说更为好用的一种“指针”。

    参考:http://www.importnew.com/3559.html

  • 相关阅读:
    在线JS代码调试网址
    NVM在windows系统下载及安装
    浏览器【插件】【扩展】下载安装
    JavaScript 秘密花园
    HTTP 协议
    移动端:zepto框架
    移动端:移动端事件
    移动端:移动端页面布局
    移动端:Flex弹性盒布局
    移动端:自适应和响应式布局
  • 原文地址:https://www.cnblogs.com/infinityu/p/3145612.html
Copyright © 2020-2023  润新知