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

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

 public void badSwap(int var1, int var2)

 {

     int temp = var1;

     var1 = var2;

     var2 = temp;

 }

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

 public void tricky(Point arg1, Point arg2)

 {

     arg1.x = 100;

     arg1.y = 100;

     Point temp = arg1;

     arg1 = arg2;

     arg2 = temp;

 }

 public static void main(String [] args)

 {

     Point pnt1 = new Point(0,0);

     Point pnt2 = new Point(0,0);

     System.out.println("X: " + pnt1.x + " Y: " +pnt1.y);

     System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);

     System.out.println(" ");

     tricky(pnt1,pnt2);

     System.out.println("X: " + pnt1.x + " Y:" + pnt1.y);

     System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);

 }

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

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

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

Java 指针or引用?的更多相关文章

  1. java指针与引用(转载)

    大家都知道java和C#中没有指针这个概念.但是也导致了编程中常常忽略了对象与引用的区别,难道java真的没有指针吗?句柄是什么?变量地址在哪里?没有地址是不可能的,关键是java中如何避免了指针这个 ...

  2. c++/java/c# 几种编程语言的指针、引用比较

    前一段时间,我在 cnblogs 别人的博客中,谈到: java 中的引用/指针,与 c++/C# 中的引用/指针不是一个概念. Java 引用,相当于 c++ 指针(fun3).Java 引用可以赋 ...

  3. C++的指针,引用,指向指针的引用和Java中的引用

    #include <iostream> #include<algorithm> using namespace std; class Test { public: Test(i ...

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

    Java中的引用传递和值传递 关于Java的引用传递和值传递,在听了老师讲解后,还是没有弄清楚是怎么一回事,于是查了资料,所以在这里与大家分享,有不对的地方,欢迎大家留言. java中是没有指针的,j ...

  5. Java中没有引用传递只有值传递(在函数中)

    ◆传参的问题 引用类型(在函数调用中)的传参问题,是一个相当扯的问题.有些书上说是传值,有些书上说是传引用.搞得Java程序员都快成神经分裂了.所以,我们最后来谈一下“引用类型参数传递”的问题. 如下 ...

  6. 不可访问内存 Java四种引用包括强引用,软引用,弱引用,虚引用

    小结: 1.不可访问内存是指一组没有任何可访问指针指向的由计算机程序进行动态分配的内存块. 2.垃圾收集器能决定是否一个对象还是可访问的:任何被确定不可访问的对象将会被释放. https://zh.w ...

  7. Java 运算符(引用和对象)

    1. 算数运算符 就是+.-.*./.%.++.--这些,没什么好说的,稍微强调下自加,自减: 前缀自增自减法(++i,--i): 先进行自增或者自减运算,再进行表达式运算. 后缀自增自减法(i++, ...

  8. java传递是引用的拷贝,既不是引用本身,更不是对象

    java传递是引用的拷贝,既不是引用本身,更不是对象 2008-09-16 04:27:56|  分类: Java SE|举报|字号 订阅     下载LOFTER客户端     1. 简单类型是按值 ...

  9. 21天学通C++学习笔记(八):指针和引用

    1. 简述 C++最大的优点之一是,既可以用它来编写不依赖于机器(主要是内存)的高级应用程序,又可以用它来编写与硬件紧密协作的应用程序. 事实上C++让您能够在字节和比特级调整应用程序的性能,而要编写 ...

随机推荐

  1. 配置ssh服务允许root管理员直接登录

    配置ssh服务允许root管理员直接登录 [root@linux-node2 ~]# grep PermitRootLogin /etc/ssh/sshd_config PermitRootLogin ...

  2. javascript-回归原生基础

    //添加事件监听兼容函数 function addHandler(target, eventType, handler){ if(target.addEventListener){//主流浏览器 ad ...

  3. 通过OTA的方式在局域网分发iOS应用

    公司的一个项目有Android和iOS的app,Android的下载和安装都很方便,不过iOS有些麻烦,因为项目本身有些限制,主要有以下一些障碍:1.iOS的版本不是通过Appstore分发.2.出于 ...

  4. asp.net 中日期的格式化显示的方法

    在Asp.net 中经常使用日期,在不同的场合,对日期的显示方式有不同的要求,为此,自己总结了一些日期格式化的方式,仅供学习参考使用: C#格式化日期时间 DateTime dt = DateTime ...

  5. sql server无log ldf日志文件附件mdf数据库重新生成ldf日志文件

    CREATE DATABASE TestDB    ON    (    FILENAME ='D:\TestDB.mdf' --路径     ) for ATTACH_REBUILD_LOG    

  6. linux 打压缩包

    tar命令 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName gz命令 解压1:gunzip FileName.gz 解压2:gzip ...

  7. python学习笔记_week19

    note 上节内容回顾: 1.Django请求生命周期 -> URL对应关系(匹配) -> 视图函数 -> 返回用户字符串 -> URL对应关系(匹配) -> 视图函数 ...

  8. 解决oracle导入未分配表空间的问题

    select 'alter table ' || t.TABLE_NAME || ' allocate extent;' from user_tables t order by t.TABLE_NAM ...

  9. 学python的第二天

    我是一个有一点点c语言基础的大二学生,今天的积累 cd指令=change directory(目录) dir=查看当前目录文件列表 convert   转化   defind  定义 cd ..   ...

  10. python中的expandtabs、\t

    expandtabs()将tab转换成空格,默认1个tab转成8个空格,\t制表符代表一个tab,我们也可以自定义转换成几个空格 举个例子: 1 a = "hello\tworld" ...