Java的引用本质上就是C中的指针,而c++的引用则完全不同;有一个类

class Point {

int x;

int y;

}

同样的一个Point p; 在Java中p表示一个引用,它等同于C语言中 struct Point *p中的p,和C++中的Point *p 的p相似。为什么说相似呢?这里有一个非常需要注意的地方,在Java Point p或者C中 struct Point *p只是声明了变量,并没有分配空间,一定要调用new Point()或者 malloc这样的语句分配空间后才能够正常使用(除非你要用结构体成员的相对地址这种特殊用法 http://coolshell.cn/articles/11377.html)

e而在c++中,Point p 直接调用Point类的构造函数分配内存空间生成对象p,等同于C语言中的结构体定义struct Point p。而在Java中,你永远看不到这个对象,你只有它的引用,看个具体的例子:

Java 代码

public class TestPoint{

static void swap(Point point, int x, int y){

Point temp_p = new Point();

temp_p.x =x;

temp_p.y = y;

point = temp_p;

}

public static void main(String[] args){

Point p = new Point();

p.x = 3;

p.y = 4;

swap(p,5,5);

System.out.println(p.x+" "+p.y);

}

}

执行结果,3 4 ,因为在swap中,point是Java的引用,它被赋值为主函数的p引用,point拉着p,p拉着堆中的一个大气球(Point对象),在函数中新建了一个对象,产生了一个新的引用temp_p,最后point放开p,和temp_p拉手,拉着函数中的临时对象,因此外部的p和对应的对象不变,等同于在函数里面吧 stuct Point *p = temp_P;

C++代码

void swap(Point &point, double x, double y){

Point temp_p;

temp_p.x =x;

temp_p.y = y;

point = temp_p;

}

int main(int argc, char** argv) {

Point p;

p.x = 3;

p.y = 4;

swap(p,5,5);

cout << p.x <

}

输出 5 5 因为point是c++的引用,所有对它的修改等同于对原变量的修改,

如果把swap函数中&该为 Point point,那无论函数里面做什么,外部的Point p都不变,因为在c++中被解读为对象本身,而函数的参数传递和Java一样也是按值传递,因此在函数中复制一个一摸一样的对象,对这个对象的操作不影响外面主函数的对象。而Java 就不同了,看下面的例子

public class TestPoint{

static void swap(Point point, int x, int y){

point.x =x;

point.y = y;

}

public static void main(String[] args){

Point p = new Point();

p.x = 3;

p.y = 4;

swap(p,5,5);

System.out.println(p.x+" "+p.y);

}

}

输出5 5,函数也是按值传递,但复制了一个一摸一样的引用,指向的是主函数的对象,在函数里面对引用的操作会影响到主函数中的对象

java c 引用区别_Java的引用c++的引用和C指针的区别相关推荐

  1. java的引用传递_Java的值传递和引用传递

    首先来看一段代码: User类: 1 public classUser {2 privateString name;3 4 publicString getName() {5 returnname;6 ...

  2. java 引用队列_Java中管理资源的引用队列相关原理解析

    当对象改变其可达性状态时,对该对象的引用就可能会被置于引用队列(reference queue)中.这些队列被垃圾回收器用来与我们的代码沟通有关对象可达性变化的情况.这些队列是探测可达性变化的最佳方式 ...

  3. java 基本类型 引用类型_Java中的基本类型和引用类型变量的区别

    基本类型: 基本类型自然不用说了,它的值就是一个数字,一个字符或一个布尔值. 引用类型: 是一个对象类型,值是什么呢?它的值是指向内存空间的引用,就是地址,所指向的内存中保存着变量所表示的一个值或一组 ...

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

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

  5. super是不是java中的标识符_java关键字super和this是什么?有什么区别?

    详细内容 本篇文章给大家带来的内容是介绍java关键字super和this是什么?有什么区别?,让大家了解关键字super和this的作用,关键字super和this的区别,以及简单介绍一下super ...

  6. java 循环new对象_java中new一个对象放在循环体里面与外面的区别

    首先说下问题: 这次在做项目的是出现了一个new对象在循环里面与外面造成的不同影响. 大家可以看到这个new的对象放在不同的位置产生的效果是不一样的. 经过多方查询与验证可以得出结论: * EasyU ...

  7. java中string 和stringbuffer的区别_Java中的String,StringBuilder,StringBuffer三者的区别...

    最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...

  8. java多线程区别_Java中实现多线程的两种方式之间的区别

    Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...

  9. java语言与c 的区别_Java语言的特点以及与C、C++的区别

    Java语言为何经久不衰,受人追捧? C++的产生让面向对象的思想更有利于我们去解决问题,弥补了C的面向过程的缺陷. 那么Java语言的产生又是为何呢?首先java也是采用面向对象的思想,但又不等同于 ...

  10. Java set的区别_Java Set集合详解及Set与List的区别

    Set是什么? Java中的Set集合是继承Collection的接口,是一个不包含重复元素的集合. 下图是Set集合的源码. Set和List都是以接口的形式来进行声明.Set主要包含三种存放数据类 ...

最新文章

  1. 过程即奖励(The Journey is the Reward)
  2. Java学习(16)--System 类/Date 类/ Calendar类
  3. 解决IE8,7下设置背景图片 background-size 不支持问题
  4. poj-2406(kmp水题)
  5. java oom dump_JVM 在遇到OOM(OutOfMemoryError)时生成Dump文件的三种方式
  6. python用circle画多边形_pythonopencv圆、椭圆与任意多边形的绘制
  7. python读取文件前30个字符_Python 批量读取文件中指定字符的实现
  8. [Sql2008错误问题]附件数据库时出现的3种常见错误的解决办法
  9. 高德地图集成之基础定位
  10. 小程序引入阿里云图标
  11. webgl的平行光漫反射示例
  12. 计算机的时钟设置错误,谷歌浏览器用不了显示电脑时钟错误解决方法
  13. C++创建Windows系统服务
  14. HTML5期末大作业:商城网站设计——仿唯品会购物商城(5页) 纯手写-高质量 HTML+CSS+JavaScript
  15. 360网站卫士php-dos,360网站卫士的CDN缓存加速功能详解
  16. ISIS-P2P网络的LSDB更新
  17. 绘制超漂亮的基因差异表达火山图
  18. LUA脚本扩展wireshark自定义的协议
  19. python自动对齐格式快捷键_ppt里自动对齐快捷键是什么,PowerPoint里自动对齐快捷键是什么?...
  20. UT、IT、ST、UAT

热门文章

  1. 算法高级(9)-线程池的实现方式
  2. 程序员的进阶课-架构师之路(大纲)-思维导图
  3. PowerDesigner(三)-企业架构模型
  4. Python学习笔记——条件分支和while循环
  5. 线性代数:矩阵乘向量的特性学习笔记
  6. Django模型之Meta选项详解
  7. topcoder srm 410 div1
  8. iphone开热点电脑总是搜不到问题的解决办法(百试百灵)
  9. 通过 User-Agent 请求头判断设备类型
  10. Ubuntu查看及修改IP地址