基于堆栈内存详析 Java函数形参是传值还是引用? | C++指针与Java引用的区别 | C++引用、指针等之间的区别 | C++与Java类的实例化的区别

简介: 基于堆栈内存详析 Java函数形参是传值还是引用? | C++指针与Java引用的区别 | C++引用、指针等之间的区别 | C++与Java类的实例化的区别

Java的引用 及 Java函数形参是传值还是引用

Java中没有指针的说法,Java中的引用就类似于C++的指针,
Java的引用是栈区的一个变量,
如果引用的是基本数据类型,那它存储着就是栈区的一块内存,(因为普通基本数据类型由栈区管,long、int、short、byte、float、double、string、boolean),做形参时是传值调用;
如果引用的是new出来的实例(new String('a')也算,直接写'a'则存在栈区),则这个引用存储的是堆区一块内存的地址(这个时候就类似于C++的指针),做形参时是传引用调用,即C++中的传指针调用;

C++中——

传值调用:形参的值跟传来的变量的值没有底层联系,各不相犯;
传指针调用:形参的值跟传来的变量的值是同一块内存的地址,可以修改同一块内存的东西,但是形参跟传来的变量是两个不同的变量;
传引用调用:形参只是取别名,是传来的变量的另外一个名字,形参跟传来的变量是同一个变量;【C++中的引用就是另外一个变量的别名,实际上是跟那个变量是同一个变量】

C++指针与Java引用的区别

C++的指针存储的是一个变量的地址*指针是这个变量的内容

int  var = 20;   // 实际变量的声明
int  *ip;        // 指针变量的声明
ip = &var;       // 在指针变量中存储 var 的地址
---
Value of var variable: 20
Address stored in ip variable: 0xbfc601ac
Value of *ip variable: 20

还有一种情况,
CTest* pTest = new CTest();
这个时候指针的内容就是一块堆内存的地址

  • **即C++指针存储的可以是一个变量的地址或者一块堆内存的地址

Java中的引用存储了一块栈/堆内存的地址
但是使用引用的时候得到的是那块内存的内容


所以本质上讲,
当它们都是用于存储一块堆内存的地址的时候,
也就是存储一个通过newnew出来的类实例的时候,
它们就是一样的,其他情况它们则不一样;**

C++的指针与C++的引用的区别

可见这篇文章
  • 指针存储的是一个变量的地址;引用就是另外一个变量的别名,实际上是跟那个变量是同一个变量;
  • 不存在空引用。引用必须连接到一块合法的内存。
  • 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
  • 引用必须在创建时被初始化。指针可以在任何时间被初始化。
   // 声明简单的变量
   int    i;
   double d;
 
   // 声明引用变量
   int&    r = i;
   double& s = d;

C++与Java创建类实例的区别

C++中类的实例化的两种方法

**Class class;对于C++来说,是在栈中实例化一个类实例,同时也调用了Class类的默认或者无参数的构造函数!!
对于Java来说则只是一个类实例的引用的声明,
还没有初始化、实例化,跟别说调用构造函数了;**

Class class = new Class();只能是Java的写法,
它跟C++中的 Class* class = new Class();是相类似的过程,
都是在堆区开辟一块内存,初始化实例化好这块内存后,把它的地址赋值给class;

也就是C++的类实例可以选择性放在栈、堆中;
Java的类实例只能放在堆中;
而C++使用new的时候需要使用指针,
Java直接用引用,没有指针;

相关文章
|
3月前
|
jenkins Shell 测试技术
|
4月前
|
缓存 安全 编译器
C++面试周刊(3):面试不慌,这样回答指针与引用,青铜秒变王者
《C++面试冲刺周刊》第三期聚焦指针与引用的区别,从青铜到王者级别面试回答解析,助你21天系统备战,直击高频考点,提升实战能力,轻松应对大厂C++面试。
494 132
C++面试周刊(3):面试不慌,这样回答指针与引用,青铜秒变王者
|
7月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
733 55
|
3月前
|
安全 jenkins Java
Java、Python、C++支持jenkins和SonarQube(一)
Jenkins 是一个开源的 持续集成(CI)和持续交付(CD) 工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
286 5
|
3月前
|
jenkins Java Shell
Java、Python、C++支持jenkins和SonarQube(全集)
Jenkins 是一个开源的持续集成(CI)和持续交付(CD)工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
400 1
|
3月前
|
jenkins Java 持续交付
Java、Python、C++支持Jenkins和SonarQube(三)
Python与Jenkins和SonarQube
138 1
|
4月前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
477 12
|
3月前
|
jenkins Java 测试技术
|
5月前
|
安全 C语言 C++
比较C++的内存分配与管理方式new/delete与C语言中的malloc/realloc/calloc/free。
在实用性方面,C++的内存管理方式提供了面向对象的特性,它是处理构造和析构、需要类型安全和异常处理的首选方案。而C语言的内存管理函数适用于简单的内存分配,例如分配原始内存块或复杂性较低的数据结构,没有构造和析构的要求。当从C迁移到C++,或在C++中使用C代码时,了解两种内存管理方式的差异非常重要。
225 26
|
6月前
|
算法 Java 数据库连接
Java 与 C++ 区别深入剖析及应用实例详解
本文深入剖析了Java和C++两种编程语言的区别,从编译与执行机制、面向对象特性、数据类型与变量、内存管理、异常处理等方面进行对比,并结合游戏开发、企业级应用开发、操作系统与嵌入式开发等实际场景分析其特点。Java以跨平台性强、自动内存管理著称,适合企业级应用;C++则因高性能和对硬件的直接访问能力,在游戏引擎和嵌入式系统中占据优势。开发者可根据项目需求选择合适语言,提升开发效率与软件质量。附面试资料链接:[点此获取](https://pan.quark.cn/s/4459235fee85)。
625 0