Java基础(1)-存在指针吗

Java 关于指针的详解(对象引用) 在 Java 中,指针的概念主要体现在对象引用上。对象引用存储的是对象的内存地址,通过对象引用可以访问和操作对象。指针在 Java 中的作用包括对象引用、数组操作和方法传递等。理解 Java 中指针的概念和操作,有助于我们更好地理解和使用 Java 对象模型,提高编程效率和代码质量。希望本文的讲解和示例对您有所帮助,如果您对 Java 中的指针或其他相关概念有任何疑问,欢迎随时交流探讨! 阅读详情
AI摘要

本文深入探讨Java中隐式指针的概念,解析其如何在堆和虚拟机栈中工作,通过创建Rectangle对象实例,展示共享内存和数据同步机制,揭示Java内部对象引用和内存管理的奥秘。


Java有指针吗?

许多刚接触Java语言的朋友可能会认为java没有指针(*),加上许多入门教程为了便于初学者理解而去解释说Java不存在像C/CPP那样的指针操作,所以java没有指针这样的认识就产生了,但答案是,java有指针,但是java开发者并不能像c++开发者一样显式地去调用指针。本文将对java指针做一基本讲解。

相关概念

1、指针

指针(Pointer),即一块存储空间的内存地址,若给定了这个内存地址,则顺着这个内存地址就可以访问到相应的内存区域。
java中的指针被称为隐式指针,不能被直接操作;而在c++中,开发中可以直接操作指针,被称为显示指针。

2、Java堆

Java堆(Heap),每一个对象或数组被创建后,该对象的实例都会存放在堆中。

3、虚拟机栈

虚拟机栈(VM Stack),存放对象相应的内存地址,即存放指针,每一个指针指向堆中的
相应对象实例。

4、共享内存

即一个内存地址(指针)被多个实例引用。

5、自动解引用

java 的点号表达式会自动解引用指针以用来访问或赋值数据域。

使用Java的隐式指针

创建一个矩形对象Rectangle
public class Rectangle {
    int x;//x轴坐标
    int y;//y轴坐标
    int width;//宽
    int height;//高


    public Rectangle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }

    public Rectangle() {
    }

}

首先,初始化Rectangle对象一个空参实例rect1和含参实例rect2,打印输出用以分析
 //初始化Rectangle对象
        Rectangle rect1 = new Rectangle();
        Rectangle rect2 = new Rectangle(10, 20, 35, 45);
        //打印对象观察
         //打印对象观察
        System.out.println("rect1->"+rect1.x+","+rect1.y+","+rect1.width+","+rect1.height
                +","+"----"+rect1);
        System.out.println("rect2->"+rect2.x+","+rect2.y+","+rect2.width+","+rect2.height
                +","+"----"+rect2);

在这里插入图片描述

内存图分析

可以看出,两个实例的数据分别初始化为了0,0,0,0和10,20,35,45,它们分别对应的内存地址是@1089e5f和@141d797,画出内存图,如下,JVM为对象实例开辟了一块堆空间(heap space),并且为内存地址开辟了栈空间(stack space),其中的指针@xxx指向了两个对象实例
在这里插入图片描述

共享内存
	//初始化Rectangle对象
        Rectangle rect1 = new Rectangle();
        Rectangle rect2 = new Rectangle(10, 20, 35, 45);
        //打印对象观察
        System.out.println("rect1->"+rect1.x+","+rect1.y+","+rect1.width+","+rect1.height
                +","+"----"+rect1);
        System.out.println("rect2->"+rect2.x+","+rect2.y+","+rect2.width+","+rect2.height
                +","+"----"+rect2);
        //将rect2的内存引用“复制给rect1”,此时rect1和rect2指向同一内存空间
        //rect1的原内存被gc
        rect1 = rect2;
        //打印rect1
        System.out.println("rect1->"+rect1.x+","+rect1.y+","+rect1.width+","+rect1.height
                +","+"----"+rect1);
        //比较内存地址
        System.out.print("内存地址比较结果->");
        System.out.println(rect1 == rect2);

rect1 = rect2,将rect2的内存地址共享给了rect1,数据域也进行了更改,此时内存图如下

内存图分析

在这里插入图片描述

此时,执行程序,rect1和rect2的指针是同一个,使用==比较指针地址,应该返回true
在这里插入图片描述

数据同步

其实,上面的程序已经在操作隐式指针了,rect1=rect2就是将指针共享,这时修改rect2的数据域,由于rect1引用了rect2的内存,所以rect1数据会同步修改

//初始化Rectangle对象
        Rectangle rect1 = new Rectangle();
        Rectangle rect2 = new Rectangle(10, 20, 35, 45);
        //打印对象观察
        System.out.println("rect1->"+rect1.x+","+rect1.y+","+rect1.width+","+rect1.height
                +","+"----"+rect1);
        System.out.println("rect2->"+rect2.x+","+rect2.y+","+rect2.width+","+rect2.height
                +","+"----"+rect2);
        //将rect2的内存引用“复制给rect1”,此时rect1和rect2指向同一内存空间
        //rect1的原内存被gc
        rect1 = rect2;
        //打印rect1
        System.out.println("rect1->"+rect1.x+","+rect1.y+","+rect1.width+","+rect1.height
                +","+"----"+rect1);
        //比较内存地址
        System.out.print("内存地址比较结果->");
        System.out.println(rect1 == rect2);
        //修改rect2的数据,rect1的数据也改变,说明指向同一内存空间
        rect2.x = 30;
        System.out.println("rect1->"+rect1.x+","+rect1.y+","+rect1.width+","+rect1.height
                +","+"----"+rect1);
        System.out.println("rect2->"+rect2.x+","+rect2.y+","+rect2.width+","+rect2.height
                +","+"----"+rect2);

    }

在这里插入图片描述

初识Java——指针 指针(Pointer) 还记得第一次接触指针是在大一的c语言学习中,当时学完之后只知道 * 就是代表的指针,但是至于其真实含义及用法还没有真正学会。这一次从零开始学习Java,又一次学习到了指针,因此对指针有了更多的认识,下面就是通过最近的学习我对指针的认知。 首先要讲指针,就不得不讲变量。因为指针中保存着变量的地址。 变量——计算机语言中能储存计算结果或能表示值的抽象概念 从字面... 阅读详情

相关推荐

算法(Java)——双指针

算法中双指针主要包括首尾双指针(对撞双指针),快慢双指针;通过指针的移动解决问题。

小朱小朱绝不认输的博客 4859

小研究 - Java 指针分析综述(一)

小研究 - Java 指针分析综述(一)

2677

Java 基础 | Java 中引用与指针的关系

关键字包含 #指针,java 引用,空指针,地址访问,引用类型,在 Java 编程语言中,程序员不需要担心程序的内存使用。Java 语言的自动垃圾收集器会不时地清理那些变成垃圾的对象。如果垃圾收集没有发生,垃圾对象将保留一个内存位置,直到程序执行结束。下面讲讲之前会怎么涉及引用的知识。Java 中引用因为存储的就是地址,所以实质上引用就是指针的另一种形式,只不过这种形式是安全形式的指针,因为引用是处于被动的存储地址的一个存在,是受控的,所以是安全的。

Chenhui98的博客 2121

对 JAVA 中 “指针“ 的理解

即没有给a[0]分配空间,即只有变量名,没有指向空间。那么a[0]就是一个good类空指针。变量名称 空间。1. 首先我们设立了一个good类,并定义了一个good类数组a。即a[0],a[1].......,a[N - 1]都是good类。(以上就是目前我对此特殊指针案例的理解)2.令a[0]内的m,v进行赋值。

Narnat的博客 6365

ubuntu虚拟机搭建OP-TEE

在网上找了一些搭建OP-TEE的过程,模仿着进行搭建,结果有好多报错,为了方便自己以后重新搭建,所以将整个过程记录下来。

weixin_44213847的博客 1001

逆向工程师的Shopee爬虫避坑指南:af-ac-enc-dat参数生成原理与反反爬策略

本文深入剖析了Shopee电商平台的反爬虫加密机制,重点解析了核心请求头参数x-sap-ri、x-sap-sec及af-ac-enc-dat的生成原理与联动关系。文章从逆向工程视角,提供了定位加密代码、分析算法逻辑的实战方法,并分享了基于JS执行环境模拟与无头浏览器控制的可持续反反爬策略,为高效、稳定地采集数据提供专业指南。

weixin_28607671的博客 1497

深入理解Java中的指针——引用

基于Java特性以及C++中指针特性的关于Java中引用类型的理解

2301_79698279的博客 3204

GROMACS新手必看:从PDB文件到完整分子动力学模拟的保姆级教程

本文提供GROMACS分子动力学模拟的保姆级教程,从PDB文件处理到完整模拟流程全覆盖。详细讲解结构预处理、系统构建、能量最小化、生产模拟等关键步骤,并分享性能优化和结果分析技巧,帮助新手快速掌握分子动力学模拟的核心操作。

yhn456789的博客 767

【Java基础算法】1.相向指针练习

本文详细介绍了双向指针练习

Nian_kuian的博客 1178

STM32F103C8T6+I2C+DMA读取陀螺仪模块JY901S(硬件I2C

说明:1.本实验代码适用移植一切stm32f1系列;2.本实验使用的是外设资源硬件I2C2;3.本实验运用的是DMA单次模式,如果需要DMA的循环模式,请移步我的另一篇文章;4.本文章不提供陀螺仪校准教学,并是在没有校准陀螺仪情况下读取数据;5.本文章是作者的学习记录及心得,如有不足,欢迎指正。 总结:亲测stm32f103c8t6最小系统板通过片上外设资源I2C配合DMA读去陀螺仪模块jy901s偏航角有效。

anquanyuanqqadsy的博客 6172

Steam游戏服务器攻防全景解读——如何构建游戏级抗DDoS防御体系?

当检测到TCP/UDP混合攻击时,应触发预设的熔断策略:优先保障游戏大厅服务的UDP 27015端口,临时限制匹配系统的TCP连接数。针对Steam游戏服务器特有的UDP 4380端口,需配置协议合规性检查规则:限制数据包长度不超过128字节,强制校验请求来源IP的真实性。Steam游戏服务器的防护需要平衡安全性与玩家体验,通过协议深度解析、智能流量调度和服务端加固的三维防御体系,可构建游戏行业专属的抗DDoS护城河。答:采用弹性防护方案,基础防护带宽保持50Gbps,遭遇攻击时自动扩展至T级清洗能力。

2501_91486804的博客 1456

Java中有没有指针

1.Java中没有指针? 有些没学过c的朋友可能还不知道什么指针。 指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(Pointed to)存在电脑存储器中另一个地方的值。也就是通过地址可以找到所需的变量单元,可以说,地址指向该变量单元。 那么Java中有没有指针呢? 有些初学Java的小伙伴可能会说:“Java中哪里有指针呢?我见都没见过”。 确实,Java中没有指针的概念,但是学过c语言的小伙伴很快就会有新的疑惑——“如果Java不存在指针的话,那么是如何实现复杂的数据结构?”

风过孤屿,山海自成诗行。 1万+

YOLOv8改进策略【卷积层】| GnConv:一种通过门控卷积和递归设计来实现高效、可扩展、平移等变的高阶空间交互操作

HorNet: 利用递归门控卷积实现高效高阶空间交互GnConv(Recursive Gated Convolution,递归门控卷积)

Limiiiing的博客 325

【Java基础总结】舍友给我带饭,请我给他讲明白Java中的引用,对象,和空指针异常~听完直呼值了,问我下顿想吃啥~

Java史上最有爱的总结!一文带你彻底搞懂面试中引用和对象,从空指针异常入手,惊呼面向对象So easy!

m0_56164356的博客 4168

24、中性原子量子计算:原理、方法与实验

本文系统介绍了中性原子量子计算的原理、方法与实验进展。重点阐述了利用碱金属原子作为量子比特,通过磁光阱、光偶极阱和光晶格等技术实现原子捕获与控制的方法。同时,详细分析了单量子比特门操作和量子态工程的实现手段,并总结了相关实验结果与未来发展方向。该技术路线为构建大规模量子计算系统提供了可行方案。

ol789012的博客 248

STM32 cubeMX配置串口重定向

这篇文章主要讲解什么是串口重定向,为什么要串口串口重定向。使用printf函数和上位机通信是非常的方便的。希望大家都能够掌握。

m0_49476241的博客 4573

java中引用和指针

首先,提个问题:JAVA中没有指针,JAVA中有指针,哪个一个对呢? 答:都对,JAVA中没有指针,因为我们不能对指针直接操作,像C++那样用->来访问变量。 JAVA有指针,因为JDK中封装了指针。(现在我们就来找到这个指针) 注意: 1、指针变量有两层含义 1) 指针变量里存的是地址(它指向的变量的首地址)。 2) 指针变量有类型,类型说明了该指针指向的变量在内存中的范围(大小)。 2、...

席同学的博客 7420

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java 指针与引用全解析

Java 中的引用在很多方面与 C/C++ 中的指针有着明显的区别,但它们在各自的语言体系中都扮演着重要的角色。在 Java 中,引用虽然不像 C/C++ 的指针那样可以进行灵活的内存操作,但它在内存管理方面具有很大的优势。Java 的垃圾回收机制依赖于引用的概念,当一个对象没有被任何引用所指向时,垃圾回收器会自动回收该对象所占用的内存空间。这大大减轻了程序员的内存管理负担,提高了程序的安全性和可靠性。同时,Java 中的引用在对象生命周期控制方面也发挥着重要作用。

老师来上课了的博客 2609

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java调用Dll存在指针或变参的解决方法

[导读]假设我有一个叫test.dll的动态库,其中有一个函数如下。 企业软件热点文章 释放Linux磁盘空间方法  轻松破除windows XP开机密码自有妙招   假设我有一个叫test.dll的动态库,其中有一个函数如下:   extern "C" int add(int* a,int* b,int* c,int d,char* PicPath)   {

traceofsun的专栏 4041

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

java 探究 null == 1 为什么空指针

探究 null == 1 为什么空指针 上代码 public static void main(String[] args) { Integer i = null; System.out.println(i == 1); } 字节码如下: 0 aconst_null 1 astore_1 2 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;> 5 aload_1 6 i

qq_15508743的博客 3905

基础算法(1)——双指针

算法题:移动零、复写零、快乐数、盛水最多的容器、有效三角形的个数、查找总价格为目标值的两个商品、三数之和、四数之和

Yuan_o_的博客 1805

Java中的空指针异常

Java中的空指针异常一、什么是空指针异常?1.1 异常的分类1.2 空指针异常引入1.3 空指针异常说明二、Java中的null三、空指针产生的常见情况及避免办法3.1 字符串常量未初始化,比较时导致空指针异常3.2 接口类型的对象没有使用具体的类进行初始化导致空指针异常3.3 参数类型为包装类型,使用时自动拆箱导致空指针异常3.4 对象为空,但未判空导致空指针异常3.5 对key、value不能为null的容器put为null的key、value值导致空指针异常3.6 方法或者远程服务返回的list不是

qq_50994235的博客 7266

11、指针基础

一、指针的理解。

emmm1531的博客 5952

Java中的指针和this指针、super指针

目前自认,this指针用于指向当前类的对象

u010804417的博客 959

java 中的指针_Java中的指针

java 中的指针 Java中有指针吗? 简短的答案是“不,没有”,这对于许多开发人员来说似乎是显而易见的。 但是,为什么对其他人却不那么明显呢? http://stackoverflow.com/questions/1750106/how-can-i-use-pointers-in-java http://stackoverflow.com/questions/2629357/do...

最佳 Java 编程 2807

java快慢指针

创建环形列表 //创建一个环形的单向链表 class CircleSingleLinkedList { // 创建一个first节点,当前没有编号 private Boy first = null; // 添加节点,构建成一个环形链表 public void addBoy(int nums) { // 对nums做一个校验 if (nums < 1) { System.out.println("数据错误"); return; } // 定义辅助节点 Boy

BraveHeart 947
上一篇: MySQL基础笔记(9)-在Ubuntu中安装MySQL数据库
下一篇: Java基础(2)-数组介绍
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值