`
qsxinyu
  • 浏览: 7558 次
  • 性别: Icon_minigender_1
  • 来自: 河南
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

C++&JAVA指针的对比

阅读更多
C C++中的指针,提供了很大的灵活性,但是灵活也带来了危险,对指针操作的不当容易造成内存泄露或是空悬指针等问题。

Java取消了指针。但实际上,java中声明的所有引用数据类型的名称,可以理解为就是一个指针。该名称存储在栈内存上,指向对内存上使用new开辟的空间。
如:
int[] array = new int[10]
整型数组名array在栈内存上,在堆内存上开辟了10*4字节的空间,用array指向该块内存。
可以把array理解为一个指针,里面存放的地址就是new出来的空间。
如:
class Person{
……
}
Person p = new Person() ;
对象名p开辟在栈内存,用new为对象在堆内存开辟空间,对象名p指向该堆内存。

但实际上呢,该名称并不像C++中的指针,特别是在进行参数传递的时候。
java已经声明:参数传递都是值传递。
但是当引用数据类型作为函数参数的时候,把一个已声明的对象p1传进来的时候,其实是产生了一个该对象的副本p2,这个p2指向p1,所以通过p2调用p1的成员时,可以完成修改,等函数调用结束,保留修改。如:
class Person{
public String name ;
public int age ;
public Person(String name ,int age){
this.name = name ;
this.age = age ;
}
}

public class Test{
public static void main(String[] args){
Person p = new Person("张三" , 10) ;
System.out.println("修改前-->姓名:"+ p.name+",年龄:"+p.age) ;
changePro(p) ; //对象p传进来,这时产生p的一个副本,假设是p1,它指向p。 //通过这个副本p1,可以调用p的成员。
System.out.println("修改后-->姓名:"+ p.name+",年龄:"+p.age) ;
}

public static void changePro(Person p){  //通过副本可以调用原对象的成员
p.name = "李四" ;
p.age = 30 ;
}
}
结果:
修改前-->姓名:张三,年龄:10
修改后-->姓名:李四,年龄:30

但当你把p1传进来之后,产生副本p2,然后试图通过p2来改变p1的指向,显然是不可能的,这时改变的仅仅是p2的指向,函数调用结束之后,p1的指向不变。如:
class Person{
public String name ;
public int age ;
public Person(String name ,int age){
this.name = name ;
this.age = age ;
}
}

public class Test{
public static void main(String[] args){
Person p = new Person("张三" , 10) ;
System.out.println("修改前-->姓名:"+ p.name+",年龄:"+p.age) ;
changeObj(p) ; //对象p传进来,这是产生p的一个副本,假设是p1,它指向p。 //在函数中,改变的只是这个副本的指向。
System.out.println("修改后-->姓名:"+ p.name+",年龄:"+p.age) ;
}

public static Person newP = new Person("李四", 30) ;

public static void changeObj(Person p){
p = newP ; //企图改变指向,实际改变的是副本的指向,
//函数结束后,原对象的指向不会改变
}
}
结果:
修改前-->姓名:张三,年龄:10
修改后-->姓名:张三,年龄:10
1
1
分享到:
评论
2 楼 qiaohan乔晗 2010-08-22  
看起来,java中的对象跟C++中的指针要点差不多啊,不知我哪里理解错了……
1 楼 Heis 2009-11-27  
指针(pointer)和引用(reference)还是有很大不同的。在C和C++中,我们可以定义指针的指针,就是指针可以指向另外一个指针。但是引用都是直接指向对象的值,不存在引用的引用。所以概念还是要区分清楚。

相关推荐

    《C++ for Java Programmers》高清完整英文PDF版

    这本书《C++ for Java Programmers》是为具有一定经验的Java程序员所写,目的是让他们利用现有...通过对比Java语言,本书强调了C++的优势和特性,并在书中穿插了丰富的实例和练习,让读者能够更好地理解C++语言的精髓。

    面向对象编程C++和Java比较教程

    1. C++有指针,可以直接操作内存,而Java没有裸指针,使用引用来代替,内存管理由垃圾回收器自动进行。 2. C++有预处理器宏,而Java没有,这使得Java更易于理解和调试,但C++的宏在某些场合提供了更大的灵活性。 3. ...

    C++与Java语言对比

    在概念性的对比上,C++强调底层控制和性能优化,程序员可以直接操作内存,使用指针进行高效的数据处理。而Java则以其“一次编写,到处运行”(Write Once, Run Anywhere, WORA)的跨平台特性著名,它通过JVM(Java...

    C++与java的综述与比较

    Java是一种完全面向对象的编程语言,它吸收了C++的优点并摒弃了一些被认为难以理解和容易引发错误的概念,如多重继承和指针等。Java的设计目标是“一次编写,到处运行”,其主要特点包括: 1. **简单性**:Java语言...

    C++、Java和C_的语法比较.doc

    这里主要聚焦于C++与C#的对比,并适当提及Java的相关特性,以帮助读者更好地理解这些语言之间的区别。 ### 一、继承 **C++**: 支持多继承,即一个类可以从多个基类继承属性和方法。 **C#**: 不支持多继承,一个类...

    C++,java,Go等语言性能对比

    ### C++, Java, Go 等语言性能对比分析 #### 概述 本文档由 Google 工程师 Robert Hundt 编写,旨在通过一种经验报告的形式,对 C++、Java、Go 和 Scala 四种编程语言进行性能比较。本研究关注于不同语言在容器类...

    C++和Java多态的区别

    本文将对比分析C++和Java中多态特性的实现机制及其差异。 #### 二、C++中的多态实现 在C++中,多态主要通过虚函数来实现。当一个类声明了一个虚函数后,它的派生类可以重写该虚函数。通过基类指针调用派生类对象的...

    Java语言与C++语言的对比分析.pdf

    Java语言的特点首先体现在其类型安全上,所有变量都是对象,并且通过引用的方式访问对象,这与C++使用指针直接访问内存的做法不同。Java的对象始终保持活跃状态,这使得Java在管理对象方面更加专业,能够有效地防止...

    The diffenences bwtween Java and C++ (JAVA与C++区别)

    本文旨在对比C++与Java这两种重要的计算机编程语言的特点。从复杂度、语法差异、内存管理等多个方面进行对比分析。 #### 关键词 C++;Java;差异 #### 引言 C++是一种广泛应用的计算机编程语言,它支持静态数据...

    一个Java程序员的C++学习之路

    C++作为一种静态类型的编译语言,提供了比Java更底层的操作能力,如直接访问内存、指针操作等,这使得C++在性能上有着显著优势。下面我们将详细探讨几个关键的知识点: ### 直接与底层交互 C++允许程序员直接与...

    JAVA c++比较 对比讲解二者不同 代码举例(英文版)

    ### C++与JAVA语言对比分析 #### 一、引言 C++与JAVA作为两种流行的编程语言,在软件开发领域有着广泛的应用。虽然JAVA的设计者熟悉C++并借鉴了其语法结构,但两者之间存在诸多差异。本文将详细介绍C++与JAVA在多...

    java/c++区别

    1) **JAVA摒弃的C++内容**:Java不支持指针,以减少内存错误,且没有全局变量和goto语句,增加代码的可读性和安全性。 2) **JAVA的新特性**:Java引入了垃圾回收机制,自动管理内存,简化了程序员的工作;并且提供了...

    C++ Java C#.net VB.net 语法对比

    ### C++、Java、C# .NET 和 VB.NET 语法对比 #### 1. 基本数据类型 为了帮助开发者快速掌握不同编程语言的基本数据类型,以下表格提供了C++、VB.NET、C# .NET 和 Java 的基本数据类型的对应关系。 | 基础类型名 |...

    java和c++比较--虚函数和指针

    本文将基于“Java和C++比较--虚函数和指针”的主题,深入探讨两种语言在虚函数机制与指针使用上的差异,以及这些差异如何影响程序设计和性能。 ### 虚函数机制 #### C++中的虚函数 在C++中,虚函数是实现多态性的...

    使用C、C++、Java实现面向对象demo

    在学习过程中,可以对比分析C++的虚函数和Java的接口,理解它们如何实现多态;也可以研究C++的模板和Java的泛型,探讨静态多态和动态多态的区别。总之,面向对象编程是现代软件开发中的重要工具,熟练掌握C、C++、...

    常见C++/java面试题

    在IT行业的面试中,C++和Java作为两种广泛使用的编程语言,经常出现在笔试和面试的题目中。这两种语言各有特点,适用于不同的应用场景。本篇文章将深入探讨C++和Java的面试知识点,帮助求职者做好充分准备。 对于...

    象棋C++和java源代码

    同时,还可以观察到C++如何利用指针和运算符重载等特性来增强代码的表达力,而Java则通过垃圾回收机制简化了内存管理。在`c++2.rar`文件中,可能展示了一种不同的C++实现,可能包含改进的算法或设计模式。 总结来说...

    c#&java比较.txt

    - **Java**:Java同样起源于C语言,但它对语法进行了大量的改进,比如移除了指针支持,提供了自动内存管理等。 **2. 类库支持** - **C#**:C#拥有.NET Framework的强大支持,提供了丰富的类库,包括但不限于图形...

Global site tag (gtag.js) - Google Analytics