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. Java 多态 父类和子类方法的访问控制权限

    Java 多态 父类和子类方法的访问控制权限 @author ixenos 父类和子类方法的访问控制权限 继承是为了扩展类的功能,而这种扩展显然就是对一个原始类的扩展,目的还是向上转型来调用,所以这就 ...

  2. CentOS系统使用配置文件修改IP地址详细教程

    在VM虚拟机安装的centos系统,默认使用的是dhcp自动获取ip地址的方式,而我自己想用这个centos在局域网内搭建一个小型演示站点,这个自动获取ip地址的方式就明显不好了,那么centos如何 ...

  3. 关于解决“No matching provisioning profiles found”问题-ios

    xcode7之后真机调试就可以不需要调试证书了,但其中也会遇到一些问题令人挠头搔耳.记录下来是给自己提供方便,也为初遇到此问题的人提供解答,利人利己的事情我做!   上图: 图一 本人有一种视警号为e ...

  4. linux服务器的操作禁忌

    1.linux系统是否支持开启SELINUX服务 我方linux系统的服务器不支持开启Selinux服务,如果开启了selinux服务,会导致系统异常并无法启动. 2.linux系统下能否开启NetW ...

  5. nginx: 响应体太大

    如果做proxy,可以将proxy配置修改buffer长度,或者直接关闭buffer.http { proxy_buffer_size 128k; proxy_buffers 4 256k; prox ...

  6. windows 查 mac

    各位,登记一下新电脑 序列号 和 MAC,麻烦大家私信发给我.1.序列号在主机有标签,类似 "Servial NO.   4CV5149L2H"2.MAC,按<“开始”+r  ...

  7. QTP使用小技巧

    1.创建action template.     当希望在每一个新建action时都增加一些头部说明,比如作者.创建日期.说明等,用action template     来实现最简单快捷.      ...

  8. Javascript和HTML dom

    今天在看DOM那一章的时候突然想到一个问题,众所周知的js的数据类型有两种:原始类型和对象类型.其中原始类型又包括以下几种类型:数字型.字符串型.布尔值.null和undefined.其中对象类型包括 ...

  9. Spring Bean 生命周期

    转自:也谈Spring Bean的生命周期 开篇先用一张老图描述下Spring中Bean容器的生命周期. 插叙一下,记得某个博文中提到:“Spring的Bean容器只管理非单例Bean的生命周期,单例 ...

  10. Mayor's posters问题处理

    题目的感悟: /*这道题的想法是先开一个数组,先构造一颗线段树,然后每次都进行一次更新最后我们在访问的时候只要看最外层还剩下那些数字,对他们进行统计然后将结果返回即可.这道题的难度本来是不大的,思路非 ...