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
分享到:
相关推荐
这本书《C++ for Java Programmers》是为具有一定经验的Java程序员所写,目的是让他们利用现有...通过对比Java语言,本书强调了C++的优势和特性,并在书中穿插了丰富的实例和练习,让读者能够更好地理解C++语言的精髓。
1. C++有指针,可以直接操作内存,而Java没有裸指针,使用引用来代替,内存管理由垃圾回收器自动进行。 2. C++有预处理器宏,而Java没有,这使得Java更易于理解和调试,但C++的宏在某些场合提供了更大的灵活性。 3. ...
在概念性的对比上,C++强调底层控制和性能优化,程序员可以直接操作内存,使用指针进行高效的数据处理。而Java则以其“一次编写,到处运行”(Write Once, Run Anywhere, WORA)的跨平台特性著名,它通过JVM(Java...
Java是一种完全面向对象的编程语言,它吸收了C++的优点并摒弃了一些被认为难以理解和容易引发错误的概念,如多重继承和指针等。Java的设计目标是“一次编写,到处运行”,其主要特点包括: 1. **简单性**:Java语言...
这里主要聚焦于C++与C#的对比,并适当提及Java的相关特性,以帮助读者更好地理解这些语言之间的区别。 ### 一、继承 **C++**: 支持多继承,即一个类可以从多个基类继承属性和方法。 **C#**: 不支持多继承,一个类...
### C++, Java, Go 等语言性能对比分析 #### 概述 本文档由 Google 工程师 Robert Hundt 编写,旨在通过一种经验报告的形式,对 C++、Java、Go 和 Scala 四种编程语言进行性能比较。本研究关注于不同语言在容器类...
本文将对比分析C++和Java中多态特性的实现机制及其差异。 #### 二、C++中的多态实现 在C++中,多态主要通过虚函数来实现。当一个类声明了一个虚函数后,它的派生类可以重写该虚函数。通过基类指针调用派生类对象的...
Java语言的特点首先体现在其类型安全上,所有变量都是对象,并且通过引用的方式访问对象,这与C++使用指针直接访问内存的做法不同。Java的对象始终保持活跃状态,这使得Java在管理对象方面更加专业,能够有效地防止...
本文旨在对比C++与Java这两种重要的计算机编程语言的特点。从复杂度、语法差异、内存管理等多个方面进行对比分析。 #### 关键词 C++;Java;差异 #### 引言 C++是一种广泛应用的计算机编程语言,它支持静态数据...
C++作为一种静态类型的编译语言,提供了比Java更底层的操作能力,如直接访问内存、指针操作等,这使得C++在性能上有着显著优势。下面我们将详细探讨几个关键的知识点: ### 直接与底层交互 C++允许程序员直接与...
### C++与JAVA语言对比分析 #### 一、引言 C++与JAVA作为两种流行的编程语言,在软件开发领域有着广泛的应用。虽然JAVA的设计者熟悉C++并借鉴了其语法结构,但两者之间存在诸多差异。本文将详细介绍C++与JAVA在多...
1) **JAVA摒弃的C++内容**:Java不支持指针,以减少内存错误,且没有全局变量和goto语句,增加代码的可读性和安全性。 2) **JAVA的新特性**:Java引入了垃圾回收机制,自动管理内存,简化了程序员的工作;并且提供了...
### C++、Java、C# .NET 和 VB.NET 语法对比 #### 1. 基本数据类型 为了帮助开发者快速掌握不同编程语言的基本数据类型,以下表格提供了C++、VB.NET、C# .NET 和 Java 的基本数据类型的对应关系。 | 基础类型名 |...
本文将基于“Java和C++比较--虚函数和指针”的主题,深入探讨两种语言在虚函数机制与指针使用上的差异,以及这些差异如何影响程序设计和性能。 ### 虚函数机制 #### C++中的虚函数 在C++中,虚函数是实现多态性的...
在学习过程中,可以对比分析C++的虚函数和Java的接口,理解它们如何实现多态;也可以研究C++的模板和Java的泛型,探讨静态多态和动态多态的区别。总之,面向对象编程是现代软件开发中的重要工具,熟练掌握C、C++、...
在IT行业的面试中,C++和Java作为两种广泛使用的编程语言,经常出现在笔试和面试的题目中。这两种语言各有特点,适用于不同的应用场景。本篇文章将深入探讨C++和Java的面试知识点,帮助求职者做好充分准备。 对于...
同时,还可以观察到C++如何利用指针和运算符重载等特性来增强代码的表达力,而Java则通过垃圾回收机制简化了内存管理。在`c++2.rar`文件中,可能展示了一种不同的C++实现,可能包含改进的算法或设计模式。 总结来说...
- **Java**:Java同样起源于C语言,但它对语法进行了大量的改进,比如移除了指针支持,提供了自动内存管理等。 **2. 类库支持** - **C#**:C#拥有.NET Framework的强大支持,提供了丰富的类库,包括但不限于图形...