当前位置: 首页 > news >正文

Java的指针、引用与C++的指针、引用的对比

笔者前两天在参加菜鸟面试的时候被面试官问到了这个问题,由于只在本科程序设计课上学过C++,已经好久没有开发实际项目,所以对C++相关的指针以及引用的记忆较为模糊,在此进行一定的知识汇总与梳理。


我们以面试中出现的问题为例来进行整理。

定义

1. 指针

指针是存储内存地址的变量,其目的是充当该地址存储的内容的别名。
所以,指针是引用,但引用不一定是指针。指针是引用概念的特定实现,该术语往往仅用于可让您直接访问内存地址的语言。

2. 引用

引用是指引用其他内容的变量,并且可以用作该其他内容的别名。

Java引用和C++的指针有什么区别?

本质不同

Java的引用是对象的另一个别名,其代表已经存在对象额另一个名字,用于访问该对象。

C++的指针是一个变量,其存储了一个内存地址,通过该地址即指向一个对象。

指向对象的方式不同

Java引用必须进行初始化,并且其创造后不能进行更改。引用在创建时必须指向一个已存在的对象,否则会抛出异常。

C++指针可以在创建后重新更改指向的对象。即可以使用指针指向一个新建的对象,或者将指针从一个对象切换到另一个对象。

安全性不同

Java引用提供安全的方式来访问对象,因为其不能指向空对象。如果试图访问引用为null的对象,则会抛出异常。

C++指针可以指向null或未初始化的内存地址,这可能导致程序崩溃或未定义行为。

类型检查不同

Java引用在编译时会进行严格类型检查,确保引用指向正确的对象类型。

C++指针在编译时不进行类型检查,但是在运行时可能会触发未定义行为,因为指针可以指向任何类型的对象。


Java中有指针吗?

Java 中没有明确的指针概念,但是有一些类似于指针的特性,如this关键字和new关键字。

而且Java中不涉及指针,可能更重要的还是考虑到了安全因素。因为如果您获得任何变量的地址,您就可以从程序的任何位置访问它,而不受任何限制,即使变量是私有的。

1. 通过指针运算访问内存

Java语言禁止指针算数。考虑到指针算数本身对虚拟机有巨大的挑战,禁止指针,可以避免运行时的大量检查带来的开销。这样能够为开发人员提供较为安全可靠的环境。

2. 安全性

不使用指针,可以为开发人员提供额外的抽象层,使开发者免受与直接内存管理相关的复杂性与潜在陷阱的影响。

3. 通过引用传递参数

Java不支持传递允许修改调用者作用域中的变量的引用。在Java中,对变量的修改通常通过返回值或对象操作来实现,从而保持语言对封装的重视,并且防止意外的副作用。

4. 手动内存管理

C和C++语言允许手动控制和内存分配,对于游戏和设备驱动程序等应用程序非常有用。但是对于面向对象编程来说,使用指针会带来复杂性和潜在的错误。

另一方面Java本身提供了垃圾收集策略作为内存管理策略的一部分。 垃圾收集器能够自动识别并回收使用的内存,将程序从手动内存管理任务中解放,简化开发过程,有助于防止内存泄漏以及相关问题的出现。


Java引用和C++引用的区别

在 C++ 中,引用只是对象的别名。它们只能引用初始化引用时设置的单个对象。

Java 引用类似于 C++ 中的 std::shared_ptr。它们一次只能引用一个对象,但可以重新绑定。它们还给出了对象生命周期的下限,即只要有一个对该对象的引用(强引用),该对象就不会被垃圾收集。

总结一下:

1. C++ 引用在引用的生命周期内绑定到同一个对象,并且在控制对象的生命周期中不发挥任何作用。

2. Java 引用一次绑定到一个对象,但可以在程序执行时分配给其他对象。如果存在对对象的任何引用,则不会被垃圾收集,这与 C++ 不同,在 C++ 中,拥有对对象的引用并不意味着该对象还活着。


扩展阅读:

[Solved] difference between java reference and c++ reference - CodeProject

Why Java does not support pointers?

C/C++ Pointers vs Java References - GeeksforGeeks

相关文章:

Java的指针、引用与C++的指针、引用的对比

笔者前两天在参加菜鸟面试的时候被面试官问到了这个问题,由于只在本科程序设计课上学过C,已经好久没有开发实际项目,所以对C相关的指针以及引用的记忆较为模糊,在此进行一定的知识汇总与梳理。 我们以面试中出现的问题为例来进行整…...

串级/级联控制知识点整理

串级控制系统是改善控制质量的有效方法之一,在过程控制中得到了广泛的应用。所谓串级控制,就是采用两个控制器串联工作,外环控制器的输出作为内环控制器的设定值,由内环控制器的输出去操纵控制阀,从而对外环被控量具有…...

数据产品读书笔记——认识数据产品经理

🌻大家可能听说的更多是产品经理这个角色,对数据产品经理可能或多或少了解一些,但又不能准确的描述数据产品经理的主要职能和与其他产品的不同,因此通过读一些书来对数据产品经理有一个准确且全面的认知。 目录 1. 数据的产品分类…...

从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 创建虚拟机

文章目录 一、虚拟机二、关于消息的API发布消息直接交换机 DIRECT 转发规则扇出交换机 FANOUT 转发规则主题交换机 TOPIC 转发规则匹配规则Router类 订阅消息消费者队列如何给订阅的消费者发送消息自动发送消息至订阅者 应答消息 三、代码编写 一、虚拟机 接下来要创建虚拟机,…...

GIT版本控制--前言

欢迎来到《GIT版本控制》专栏!在当今软件开发和协作的世界中,版本控制是不可或缺的工具之一。无论您是一名初学者,一位经验丰富的开发者,还是一个项目团队的成员,都有可能会受益于对GIT的深入了解。 GIT是一个强大的分…...

由于 MAC 地址的问题,导致网络不通的原因和分析

由于 MAC 地址的问题,导致网络不通的原因和分析 将现象及原因分析发给大家,供大家参考,以后有类似问题时有个解决问题的参考开发板网络不通,也抓不到包,折腾了好久,将电脑和开发板用网线直连,结…...

游戏开发中的设计模式

单例模式 实例化单一对象,懒加载 //单例模式 class GameManagerSingleton {private constructor(){}private static instance:GameManagerSingleton;public static Instance(){if(!GameManagerSingleton.instance){this.instance new GameManagerSingleton();}re…...

React核心原理与实际开发

学习目标 React是啥? 官方定义:将前端请求获取到的数据渲染为HTML视图的JavaScript库。 一、React入门 1、React项目创建 直接创建react,使用初始化会创建package.json npm init -y再安装 2、React基本使用 使用纯JS创建ReactDOM&#…...

Springboot+vue的企业OA管理系统(有报告),Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的企业OA管理系统(有报告),Javaee项目,springboot vue前后端分离项目。 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的企业OA管理系统,采用M(m…...

3、字符设备驱动框架和开发步骤

一、Linux内核对文件的分类 Linux的文件种类 1、-:普通文件2、d:目录文件3、p:管道文件4、s:本地socket文件5、l:链接文件6、c:字符设备7、b:块设备 Linux内核按驱动程序实现模型框架的不同&…...

[MySQL]基础篇

文章目录 1. MySQL基本使用1.1 MySQL的启动和登录1.1.1 MySQL的启动1.1.2 MySQL的客户端连接 1.2 数据模型 2. SQL2.1 SQL类型2.1.1 数值类型2.1.2 字符串类型2.1.3 日期类型 2.2 DDL2.2.1 数据库操作2.2.2 表操作 - 查询2.2.3 表操作 - 创建表2.2.4 表操作 - 修改 2.3 DML2.3.…...

Meta Semantic Template for Evaluation of Large Language Models

本文是LLM系列文章,针对《Meta Semantic Template for Evaluation of Large Language Models》的翻译。 大型语言模型评估的元语义模板 摘要1 引言2 相关工作3 方法4 实验5 结论 摘要 大型语言模型(llm)是否真正理解语言的语义,或者只是记住训练数据?…...

Git相关知识(1)

目录 1.初识Git 1.基础知识 2.centos中下载 2.基本操作 1.创建本地仓库 2.配置本地仓库 3.版本库、工作区、暂存区 4.添加文件 5.add和commit对git文件的作用 6.修改文件 7.版本回退 8.撤销修改 9.删除文件 3.分支操作 1.HEAD与分支 2.创建分支 3.删除分支 …...

pytorch中nn.DataParallel多次使用

pytorch中nn.DataParallel多次使用 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader# 定义模型 class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.fc nn.Linear(10, 1)def forwa…...

制作电商页面(Html)

任务 制作一个电商页面&#xff0c;要求所卖物品清晰&#xff0c;页面色调清晰&#xff0c;要有主页和详情页。 网站所买物品&#xff1a;书籍 色调&#xff1a;#FF2400 橙红色 代码 主页HTML代码&#xff1a; <html><head><meta charset"utf-8"…...

Android Sutdio依赖Snapshot版本,无法同步最新的包

起因 局域网中搭建了Nexus托管本地打包的aar&#xff0c;正常情况下&#xff0c;把修改完成的库推送到仓库后&#xff0c;其他项目引用Snapshot版本的依赖&#xff0c;同步后会马上下载最新的包&#xff0c;但是当第二次推送后&#xff0c;就没有重新下载最新的包&#xff0c;…...

Feign调用异常触发降级捕获异常

通过配置fallbackFactory来捕获异常信息&#xff0c;代码如下 FeignClient(name "user", fallbackFactory UserFallBackFactory.class) public interface UserFeign {PostMapping("/get/list")Map getList();}Component public class UserFallBackFacto…...

Springboot 音乐网站管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 音乐网站管理系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统 具有完整的源代码和数据库&…...

微信支付v2-02

...

企业的销售活动是什么?CRM销售管理系统给你答案

在企业业务中&#xff0c;销售活动是实现企业业绩目标的基本单元&#xff0c;起着奠基石的作用。CRM销售管理系统是销售活动管理的必备工具&#xff0c;帮助企业更好地开展销售活动。下面来说说企业的销售活动是什么&#xff1f; 什么是销售活动 简单来说&#xff0c;销售人员…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...