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 <<" "<<p.y<<endl;
}

输出 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++的引用和C指针的区别的更多相关文章

  1. Java 对象引用方式 —— 强引用、软引用、弱引用和虚引用

    Java中负责内存回收的是JVM.通过JVM回收内存,我们不需要像使用C语音开发那样操心内存的使用,但是正因为不用操心内存的时候,也会导致在内存回收方面存在不够灵活的问题.为了解决内存操作不灵活的问题 ...

  2. java强引用、软引用、弱引用、虚引用

    前言概述 在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象.这就像在日常生活中,从商店购买了某样物品后,如果有用,就一直保留它,否则就把它扔到垃圾箱,由清洁工人收走 ...

  3. 【转载】 Java 7之基础 - 强引用、弱引用、软引用、虚引用

    原文地址:http://blog.csdn.net/mazhimazh/article/details/19752475 1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一 ...

  4. Java中的引用类型(强引用、弱引用)和垃圾回收

    Java中的引用类型和垃圾回收 强引用Strong References 强引用是最常见的引用: 比如: StringBuffer buffer = new StringBuffer(); 创建了一个 ...

  5. Java之强引用、 软引用、 弱引用、虚引用

    1.强引用 平时我们编程的时候例如:Object object=new Object();那object就是一个强引用了.如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它. ...

  6. Java学习之强引用,弱引用,软引用 与 JVM

    1.java内存管理分为内存分配和内存回收,都不需要程序员负责. 2.垃圾回收的机制主要是看对象是否有引用指向该对象.  java对象的引用包括  强引用 软引用 弱引用 虚引用 3.强引用 是指创建 ...

  7. Java基础必备 -- 堆栈、引用传值、垃圾回收等

     在Java中,对象作为函数参数的传递方式是值传递还是引用传递?String str = "abc" 与 String str = new String("abc&quo ...

  8. Java 如何有效地避免OOM:善于利用软引用和弱引用

    Java 如何有效地避免OOM:善于利用软引用和弱引用 想必很多朋友对OOM(OutOfMemory)这个错误不会陌生,而当遇到这种错误如何有效地解决这个问题呢?今天我们就来说一下如何利用软引用和弱引 ...

  9. java 方法参数-值调用,引用调用问题

    (博客内容来自于core java卷一) 1. xx调用:程序设计语言中方法参数的传递方式: 引用调用(call by reference):表示方法接收的是调用者提供的变量地址. 值调用(call ...

  10. Java四种引用包括强引用,软引用,弱引用,虚引用。

    Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.e ...

随机推荐

  1. Python 处理文件

    1.从现有文件中获取信息 使用Python中的模块,可以从现有文件中获取信息.使用“os”模块和“stat”模块可以获取文件的基本信息: import os import stat import ti ...

  2. bootstrap-modal.js 居中问题

    上下居中 引用 bootstrap-modalmanager.js   左右居中 修改 bootstrap-modal.js 中 this.$element.css('margin-left', '' ...

  3. [kuangbin带你飞]专题四 最短路练习 POJ 3268 Silver Cow Party

    题意: 在一个有向图中求n头牛从自己的起点走到x再从x走回来的最远距离 思路一开始是暴力跑dij…… 讲道理不太可能…… 然后就百度了一下 才知道把矩阵转置的话就只需要求两次x的单源最短路…… /* ...

  4. 将数据库的数据导入solr索引库中

    在solr与tomcat整合文章中,我用的索引库是mycore,现在就以这个为例. 首先要准备jar包:solr-dataimporthandler-4.8.1.jar.solr-dataimport ...

  5. def语句常见错误

    自觉不才,使用def语句时容易出现以下错误, 参考: 习题—25 http://www.2cto.com/shouce/Pythonbbf/ex25.html def add(): print &qu ...

  6. 2015 Multi-University Training Contest 3

    1001 Magician 线段树.根据奇偶性分成4个区间.维护子列和最大值. 想法很简单.但是并不好写. 首先初始化的时候对于不存在的点要写成-INF. 然后pushup的时候.对于每个区间要考虑四 ...

  7. 关于dubbo服务产生异常之:Caused by: com.alibaba.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer.

    简单来说就是dubbo超时,因为dubbo默认的时间是500ms,超过这个时间它会重新访问service层,最多尝试三次. 所以我在测试的时候日志显示出来的异常为……timeout……. 开始设置开始 ...

  8. 利用socket模块检查端口存活并邮件警报

    可以用来监控一些端口. import socket def check_server(addr, port): s = socket.socket() try: s.connect((addr, po ...

  9. iOStextView的代理方法展示

    UITextView的代理方法 textViewShouldBeginEditing: and textViewDidBeginEditing: - (BOOL)textViewShouldBegin ...

  10. 《JS权威指南学习总结--4.13运算符》

    一.typeof运算符     typeof是一元运算符,放在其单个操作数的前面,操作数可以是任意类型.返回值为表示操作数类型的一个字符串.     例如:     typeof x          ...