文章目录

  • Java有指针吗?
  • 相关概念
    • 1、指针
    • 2、Java堆
    • 3、虚拟机栈
    • 4、共享内存
    • 5、自动解引用
  • 使用Java的隐式指针
    • 创建一个矩形对象`Rectangle`
    • 首先,初始化`Rectangle对象`一个空参实例`rect1`和含参实例`rect2`,打印输出用以分析
    • 内存图分析
    • 共享内存
    • 内存图分析
    • 数据同步

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,010,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的原内存被gcrect1 = rect2;//打印rect1System.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的原内存被gcrect1 = rect2;//打印rect1System.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基础(1)-存在指针吗相关推荐

  1. java基础day11---空指针异常----引用类型--自定义类型赋值--封装

    day11 1.空指针异常--- --属于运行错误-java.long.NullPointerException --原因:当引用名称的值为null时,就不能访问某个对象中的属性或方法 热锅非要访问这 ...

  2. 叮!您收到一份超值Java基础入门资料!

    摘要:Java语言有什么特点?如何最大效率的学习?深浅拷贝到底有何区别?阿里巴巴高级开发工程师为大家带来Java系统解读,带你掌握Java技术要领,突破重点难点,入门面向对象编程,以详细示例带领大家J ...

  3. Java基础看jvm,JAVA基础知识|java虚拟机(JVM)

    一.JVM简介 java语言是跨平台的,兼容各种操作系统.实现跨平台的基石就是虚拟机(JVM),虚拟机不是跨平台的,所以不同的操作系统需要安装不同的jdk版本(jre=jvm+类库:jdk=jre+开 ...

  4. Java基础(十一) Stream I/O and Files

    Java基础(十一) Stream I/O and Files 1. 流的概念 程序的主要任务是操纵数据.在Java中,把一组有序的数据序列称为流. 依据操作的方向,能够把流分为输入流和输出流两种.程 ...

  5. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

  6. java基础-迭代器(Iterator)与增强for循环

    java基础-迭代器(Iterator)与增强for循环 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Iterator迭代器概述 Java中提供了很多个集合,它们在存储元素时 ...

  7. Java基础:由JVM内存模型详解线程安全

    1.前言 最近在研究JVM内存模型和Java基础知识.主要讲的是线程共享变量与线程私有变量以及如何写出线程安全的代码.这里列出一条规则,"类中的成员变量,也叫实例变量,也叫全局变量,它是非线 ...

  8. 【转】Java基础知识整理

    本博文内容参考相关博客以及<Java编程思想>整理而成,如有侵权,请联系博主. 转载请注明出处:http://www.cnblogs.com/BYRans/ PDF版下载链接:<Ja ...

  9. java面试题(java基础)

    1.JDK和JRE有什么区别? JRE: Java Runtime Environment  (java运行时环境) JDK:Java Development Kit(java开发工具包) 简单的说就 ...

最新文章

  1. c ef框架-mysql_.net EF框架 MySql實現實例
  2. POJ 3420 Quad Tiling
  3. 浅谈ASP.NET的Postback
  4. 越南黑客组织APT32正对NSA网络武器开展研究利用
  5. python3月新增知识点
  6. Mysql 的隔离级别与锁
  7. android design包控件,Android Design包之TextInputLayout和TextInputEditText的组合使用【原创】...
  8. 「管理数学基础」1.5 矩阵理论:方阵的行列式因子、不变因子、初等因子
  9. 易语言_酷Q机器人插件_01
  10. 怎么隐藏splitcontainer分界线
  11. 【第3版emWin教程】第14章 emWin6.x的2D图形库之基本绘图
  12. 2018区块链技术及应用峰会(BTA)倒计时2天,最强百人区块链大咖齐聚
  13. 第六节NoSQL+时序数据库+RabbitMQ安装
  14. NDB和InnoDB存储引擎比较
  15. 蝴蝶效应、青蛙现象、鳄鱼法则、鲇鱼效应、羊群效应、刺猬法则、手表定律、破窗理论、二八定律、木桶理论、马太效应
  16. MySQL初级篇——存储过程、存储函数的相关概念及应用举例
  17. wallpaper设置壁纸图片被拉伸
  18. 浏览器被劫持打开变成hao123 和 vs CODE编译器无法打开浏览器问题
  19. 安卓aab包安装方式
  20. matlab 与 python 在科学计算中的区别比较

热门文章

  1. Raw Socket和Socket编程
  2. 【转】看板和Scrum相得益彰
  3. Linux jinfo报错 Doesn’t appear to be a HotSpot VM
  4. windows 10 平台安装 vim 插件 YouCompleteMe 详细流程
  5. 2022杭电多校联赛第八场 题解
  6. 用Qemu搭建x86学习环境
  7. 3-2Virsh控制工具
  8. JavaScript-点击复制内容
  9. 验证码识别之w3cschool字符图片验证码(easy级别)
  10. 怎么样查看视图+mysql_如何查看视图的sql语句