对象引用与对象存放的地址和区别

2023-10-29

在java的学习当中,很多时候并没有能很好分清把对象和对象的引用。如果没能很好认识分清这两者的关系,就可能会很难理解一些指针的移动的代码。

JAVA基本类型的变量的时其变量名及值(变量名及值是两个概念)是放在方法栈中,引用类型所声明的变量(该变量实际上是在方法中存储的是内存地址值)是放在方法的栈中,该变量所指向的对象是放在堆类存中的。

我们先定义一个简单的类:

public class DemoClass {
    private String name;
}

有了这个模板,就可以用它来创建对象:
DemoClass demo= new DemoClass ();
通常把这条语句的动作称之为创建一个对象,其实,它包含了四个动作。
1)右边的“ new DemoClass”,是以DemoClass类为模板,在堆空间里创建一个DemoClass类对象(也简称为DemoClass对象)。
2)末尾的()意味着,在对象创建后,立即调用DemoClass类的构造函数,对刚生成的对象进行初始化。
3)左边的“DemoClass”创建了一个DemoClass类引用变量。所谓DemoClass类引用,就是以后可以用来指向DemoClass对象的对象引用。
4)“=”操作符使对象引用指向刚创建的那个DemoClass对象。
我们可以把这条语句拆成两部分:
DemoClass demo; --对象引用变量
demo= new DemoClass (); --对象本身
效果是一样的。这样写,就比较清楚了,有两个实体:一是对象引用变量,一是对象本身。

通过上面知识我们来看两个相对复杂一点demo,这个例子中通过tempHead 改变对实体对象指向的改变,使其tempHead 一直指向链表的末尾。head 指向链表头部

public class TempClass {

    @Test
   public void replaceSingleNode(){
        //定义一个请求头对象
       SingleLinkedNode head = new SingleLinkedNode(0);
       //定义tempHead的引用名 将指向  new SingleLinkedNode(0) 这个对象本身
       SingleLinkedNode tempHead=head;
       for (int i = 1; i <=5 ; i++) {
           //tempHead.next 引用名  将指向 new SingleLinkedNode(i)本身
           tempHead.next = new SingleLinkedNode(i);
           //tempHead引用名  指向  tempHead 的下个对象本身
           tempHead = tempHead.next;
       }
       //这个时候head 这个引用名 实际指向  new SingleLinkedNode(0);
       System.out.println("请求头:"+head);
       //这个时候 tempHead 这个应用名实际指向  new SingleLinkedNode(i); 当i=5的时候
       System.out.println("运输对象:"+tempHead);
   }


    @Data
    class SingleLinkedNode{
        private int value;
        private SingleLinkedNode next;

        public SingleLinkedNode(int value) {
            this.value = value;
        }

    }





}

打印内容

请求头:TempClass.SingleLinkedNode(value=0, next=TempClass.SingleLinkedNode(value=1, next=TempClass.SingleLinkedNode(value=2, next=TempClass.SingleLinkedNode(value=3, next=TempClass.SingleLinkedNode(value=4, next=TempClass.SingleLinkedNode(value=5, next=null))))))
运输对象:TempClass.SingleLinkedNode(value=5, next=null)

我们的出 tempHead = tempHead.next; 只是改变tempHead 这个引用对象,而不是直接对对象进行替换,我这里再用一个双链表来作证这一结论。在双链表中如果是不是覆盖,那最后tempHead就应该保留整条链表数据,只是tempHead指向链表末尾的字段。

public class TempClass {

    
    @Test
    public void replaceDoubleNode(){
        //定义一个请求头对象
        DoubleLinkedNode head = new DoubleLinkedNode(0);
        //定义tempHead的引用名 将指向  new SingleLinkedNode(0) 这个对象本身
        DoubleLinkedNode tempHead=head;
        for (int i = 1; i <=5 ; i++) {
            //newNode 引用名  将指向 new SingleLinkedNode(i)实体本身
            DoubleLinkedNode newNode = new DoubleLinkedNode(i);
            //tempHead.tail 这个引用 指向new DoubleLinkedNode(i);实体
            tempHead.tail =newNode;
            //newNode 这个引用 指向tempHead 的实体
            newNode.front = tempHead;
            //将tempHead 指向  tempHead.tail 实体 ,也就是 new DoubleLinkedNode(i) 实体本身
            tempHead = tempHead.tail;
        }
        System.out.println("请求头:"+head);
        System.out.println("运输对象:"+tempHead);
    }







    class DoubleLinkedNode{
        private int value;
        private DoubleLinkedNode front;
        private DoubleLinkedNode tail;

        public DoubleLinkedNode(int value) {
            this.value = value;
        }
    }
}

在这里插入图片描述

希望通过这里讲解说明,能够很好的认识引用和对象本身的区别

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对象引用与对象存放的地址和区别 的相关文章

  • 用ChatGPT生成openAI全景报告

    云孚科技基于业内领先的自然语言处理 知识图谱 语义匹配 智能写作等技术 打造了云孚开源情报系统YFINT 并结合ChatGPT模型成果 重磅推出OpenAI调研报告 ChatGPT简介 2022年11月30日 总部位于旧金山的OpenAI推
  • 【13届蓝桥杯复盘】九进制转十进制 顺子日期

    问题描述 九进制正整数 2022 下标9 转换成十进制等于多少 方法 权值展开 2 93 2 9 2 9 0 1478 如果 一定要用代码来实现 C 代码如下所示 include

随机推荐

  • python+selenium实现cookie登录,并抓取指定类class下的html内容

    个人研究学习研究用 1 首先通过链接手动登录 https www educity cn 获取cookie信息 2 再使用站点cookie登录 跳转到https uc educity cn tiku testReport html id 80
  • Hadoop组件的一些总结

    前言 Hadoop是一个由Apache基金会所开发的分布式系统基础架构 用户可以在不了解分布式底层细节的情况下 开发分布式程序 充分利用集群的威力进行高速运算和存储 提示 以下是本篇文章正文内容 下面案例可供参考 一 Hadoop的组成 H
  • [转]为什么未来不需要我们?

    为什么未来不需要我们 在21世纪 我们威力无比的三种科技 机器人 基因工程和纳米技术正在使人类成为濒危物种 作者 比尔 乔伊 自从我从事科技创造的那一刻起 我就关注其在伦理上的问题 但直到1998年秋天我才认识到我们在21世纪面临着多大的危
  • python3+flask 开发web(一)

    1 环境准备 1 安装Python https www python org 2 安装python ide pycharm https www jetbrains com pycharm 3 安装flask 安装好了python 电脑就自动
  • 如何使用gdb调试java虚拟机_GDB入门教程之如何使用GDB启动调试

    GDB The GNU Project Debugger 是 Linux 系统下调试 C 和 C 程序的主要神兵 Vim教程网 https vimjc com 介绍多种方式下使用 GDB 启动进程调试的方法和命令 要使得 C 和 C 程序能
  • varchar和char的区别

    1 char n 和varchar n 中括号中n代表字符的个数 并不代表字节个数 所以当使用了中文的时候 UTF8 意味着可以插入m个中文 但是实际会占用m 3个字节 即 n限制了存储多长的值 但是所占用的空间大小不一致 例如varcha
  • 使用 Amazon Rekognition API 进行文本检测和 OCR

    使用 Amazon Rekognition API 进行文本检测和 OCR 这篇博客将介绍如何 使用Amazon Rekognition API 进行文本检测和 OCR 包括如何创建 Amazon Rekognition密钥 安装boto3
  • Java 中的集合框架有哪些?(十四)

    Java 中的集合框架包含了各种不同类型的集合和数据结构 用于存储和处理数据 这些集合和数据结构可以提高程序的性能和可读性 并且可以方便的进行数据操作和算法实现 本文将介绍 Java 中的集合框架 以及各种不同类型的集合和数据结构 Java
  • Vue父子组件传值---- $listeners子传父的父

    最近在写vue子组件给父组件传值时 一不小心写了五个组件 这个时候用到了子组件给父组件传值 其中不乏子组件跨过它的父组件 给它的父组件的父组件传值 也就是给它的爷爷传值 听到这里是不是快晕了 来 上干货 这是demo1 也是最底层的子组件
  • JavaSE - 集合类-单列集合框架

    JavaSE 集合类 单列集合框架 本节学习目标 了解Java单列集合框架结构 了解并掌握Collection接口及其方法 了解并掌握List集合 接口 及其方法 了解并掌握Set集合 接口 及其方法 了解并掌握Queue集合 接口 及其方
  • 【Hexo github】进行SSH认证时报错git操作提示git@github.com: Permission denied (publickey)(已解决)

    进入git bash界面然后 SSH keys 1 git config global list 2 git config global user name yourname git config global user email ema
  • Vue3+swiper5 异步请求数据后轮播图出现无分页器小圆点和无法滑动的问题,如果有默认图片则从最后一张切换到第一张时会展示默认图片

    一 场景描述 异步请求获取到11张图片 页面播图无分页器小圆点和无法正常滑动 package json devDependencies vue cli plugin babel 4 5 13 vue cli plugin router 4
  • 30,31-添加类功能视图

    这节分两部分 一 如何将代码从关卡蓝图转到类蓝图中 二 如何在类蓝图中切换灯光 1 通过判断和灯的距离切换灯光 2 通过文本提示切换灯光 先看第一个问题 如何将代码从关卡蓝图转到类蓝图中 其实这个很好理解 关卡蓝图相当于main 函数 关卡
  • Springboot + MySQL+ JPA Ⅳ find自带方法详解

    find是CRUD中的R 是使用得最多的方法 此篇先整理下自带的find方法 不需要在dao层写对应接口 后续会整理下拓展方法 一 getById 通过id进行单个查询 跟findById差不多 返回值类型不一样 service层 Tran
  • sqli-labs: Less 21-65 通关教程

    第二十一关 cookie注入 YOUR COOKIE uname RHVtYg and expires Sat 16 Jul 2016 08 32 26 注 RHVtYg 是 Dumb 经Base64加密后的值 和上关又是差不多 base6
  • python匹配ip地址

    ip地址是用3个 号作为分隔符 分割4个数字 每个数字的取值在 0 255 一般日志文件中的ip地址都是有效的ip地址 不需要我们再去验证 因此 若从日志文件中提取ip 那么可以简单写成这样 gt gt gt import re gt gt
  • unity2022.1.8之后版本的新的输入行为控制对象变化

    文章目录 unity2022 1 8之后版本的新的输入行为控制对象变化 怎么导入 如何使用 unity2022 1 8之后版本的新的输入行为控制对象变化 我们先了解大概的逻辑 我们要设置触发行为的方式并且让他和对象的行为绑定 再将行为和对象
  • A complete log of this run can be found in

    安装element ui时遇到的问题 解决方法 接下来测试一下 问题解决
  • 使用OpenCV的GrabCut算法去除图像背景

    使用OpenCV的GrabCut算法去除图像背景 图像分割是计算机视觉中的重要任务之一 它可以将图像分割成不同的区域 并对这些区域进行进一步的分析和处理 其中一种常用的图像分割方法是GrabCut算法 它是一种基于图割的迭代算法 可以有效地
  • 对象引用与对象存放的地址和区别

    在java的学习当中 很多时候并没有能很好分清把对象和对象的引用 如果没能很好认识分清这两者的关系 就可能会很难理解一些指针的移动的代码 JAVA基本类型的变量的时其变量名及值 变量名及值是两个概念 是放在方法栈中 引用类型所声明的变量 该