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. hdu_5925_Coconuts(离散化+dfs)

    题目链接:hdu_5925_Coconuts 题意: 给你一张很大的图,和小于200个的障碍点,问这张图中的联通块有多少个 题解: 由于障碍点只有200个,所以肯定有很多的空白部分,我们将这些空白部分 ...

  2. 把嵌入在eclipse中的tomcat日志分离出来

    现象 不知道从哪个版本的tomcat开始,windows版本的tomcat不再包含{tomcat_home}\logs\catalina.out这个文件,eclipse中配置好tomcat服务器之后, ...

  3. HashMap解惑

    HashMap中有一些我们容易忽视的点 1. 关于key的hash和equals public V put(K key, V value) { if (table == EMPTY_TABLE) { ...

  4. JAVASCRIPT 框架>>

    jQuery jQueryjQuery 是目前最受欢迎的 JavaScript 框架 jQuery 是为处理 HTML 事件而特别设计的<script type="text/javas ...

  5. ESFramework 4.0 快速上手(01) -- Rapid引擎

    (在阅读该文之前,请先阅读 ESFramework 4.0 概述 ,会对本文的理解更有帮助.) ESFramework/ESPlatform 4.0 的终极目标是为百万级的用户同时在线提供支持,因为强 ...

  6. UVALive 6672 Bonus Cards 概率dp

    题意呢 就是有两种售票方式 一种是icpc 一种是其他方式 icpc抢票成功的概率是其他方式的2倍…… 这时 一个人出现了 他通过内幕知道了两种抢票方式各有多少人 他想知道自己如果用icpc抢票成功的 ...

  7. JAVA中计算两个时间相差多少 天,时,分,秒

    1: import java.util.Date; 2: 3: public class ShowTimeInterval{ 4: public void ShowTimeInterval(Date ...

  8. KVM 虚拟化基本搭建

    KVM虚拟化技术 KVM是基于x86架构上Linux操作系统的全虚拟化解决方案 ,在Centos6.3系统中,kvm已经被集成到内核中,相当于使用内核来做虚拟机管理程序.由于KVM本身就工作于内核环境 ...

  9. linux内核驱动——从helloworld开始

    学习编程第一个都是学习hello world程序,学习内核驱动自然也不例外,我也是!本文整理了网上的一些资料以及加上自己的一些心得体会,希望对初学者有帮助,可别小看这个简单的hello world,本 ...

  10. c语言-猜数字游戏

    #include <stdio.h> #include <stdlib.h> int top(); int input(); void main() { ; int numbe ...