Java数据类型:引用类型

news2025/1/21 12:23:17

Java的数据类型可以分为基本数据类型(8种)和引用类型

本文将深入探讨引用类型的概念、使用方法、工作原理,并通过代码示例加以说明,帮助读者全面理解这一Java编程的核心要素。

1. 引用类型的定义

引用类型,顾名思义,是用于存储对象引用(或称为句柄)的数据类型。引用类型不是类或者对象,只是变量的一种类型。

当我们声明一个引用类型的变量时,该变量并不直接存储对象本身(如下图的变量obj1),而是存储了指向对象在内存中位置的一个地址(如下图的堆地址1)。这意味着,通过引用类型的变量,能够间接地操作对象

在这里插入图片描述

2. 引用类型的使用

创建与赋值

使用引用类型的基本步骤包括创建对象实例和将其引用分配给变量。例如,创建一个String对象:

String str = new String("Hello, Java!");

这里,str是一个引用类型变量,它存储的是新创建的String对象在内存中的地址。通过这个引用,我们可以访问和修改字符串内容(尽管对于不可变的String对象,修改操作会创建新的对象)。

引用赋值

在Java中,可以把一个引用类型变量的值赋给另一个引用类型变量:

Object obj1 = new Object();
Object obj2 = obj1;

对于赋值语句Object obj2 = obj1;,JVM会在栈内存新增一个变量obj2,变量值和obj1相同,相当于把变量obj1的值复制给变量obj2,此后,变量obj1和obj2指向同一个对象。
在这里插入图片描述
在Java的方法调用中,也可以传递引用类型参数。当将引用作为参数传递时,传递的并非是变量本身,而是变量的副本。

如下图的代码,将obj1变量作为参数传递给print方法,和变量赋值类似,JVM会在栈内存新增一个变量obj,其值和obj1变量的值相同。

public void print(Object obj) {
    System.out.println("obj=" + obj);
}

Object obj1 = new Object();
print(obj1);

在这里插入图片描述

无论是上面的“变量赋值”还是“参数传递”,都相当于复制了变量obj1的值,最后obj2和obj1都指向地址1上的对象,通过这两个变量能操作同一个对象。

但是,如果变量obj2指向一个新的地址,比如地址2,obj1变量的地址不会发生变化。如下代码所示:

变量赋值:

Object obj1 = new Object();
Object obj2 = obj1;
// 修改变量,指向一个新的对象,下图的[堆地址3]
obj2 = new Object();

参数传递:

public void print(Object obj) {
    System.out.println("obj=" + obj);
    // 修改变量,指向一个新的对象,下图的[堆地址3]
    obj = new Object();
}

Object obj1 = new Object();
print(obj1);

图示:

在这里插入图片描述
重新赋值后,变量obj1和obj2指向不同的对象,通过变量操作的对象也不再是同一个了。

3. 引用类型的原理

Java的内存模型对理解引用类型的工作原理至关重要。对象实例存储在堆内存中,而引用则存储在栈内存。当创建一个对象时,Java虚拟机(JVM)会在堆上分配必要的内存,并返回该对象的地址。引用变量则持有这个地址,通过它来访问和操作对象。这种分离存储机制既节省了栈空间,又允许高效地管理堆上的对象生命周期。

4. 引用类型的代码demo

以下示例展示了引用类型如何帮助实现对象的共享和修改:

class Point {
    int x, y;

    Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    void move(int dx, int dy) {
        x += dx;
        y += dy;
    }

    @Override
    public String toString() {
        return "(" + x + ", " + y + ")";
    }
}

public class ReferenceTypeDemo {
    public static void main(String[] args) {
        Point p1 = new Point(1, 2);
        Point p2 = p1; // p2是p1的别名,指向同一对象

        System.out.println(p1); // 输出: (1, 2)
        System.out.println(p2); // 同样输出: (1, 2)

        p2.move(5, 5); // 通过p2修改对象,影响到p1

        System.out.println(p1); // 输出已改变: (6, 7)
        System.out.println(p2); // 同样改变: (6, 7)
    }
}

这段代码展示了当两个引用变量指向同一个对象时,通过任一变量对对象的修改都会影响到另一个变量看到的对象状态,深刻体现了引用类型在对象共享中的作用。

结语

通过引用类型的变量对Java对象进行操作,赋予Java对象以生命力。通过本文的解析与示例,希望读者能更加深入地掌握引用类型,灵活运用这一强大工具,构建更加高效、健壮的Java应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1681849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年抖店保证金交多少?保证金常见问题解答,一文解决你所有疑惑

大家好,我是电商花花 新手如果想要开抖音小店,有一个大坑是必须要避开的。 就是我们店铺开通之后,我们一定要交保证金,如果不交,那就是0元开店。 很多新手听别人说做抖音小店可以0元开店,不用缴纳保证金就…

亚马逊测评真人号与自养号:如何选择?区别与作用全面解析

亚马逊卖家都希望能打造出热销产品的产品列表,因为评论对于列表的曝光和流量有着巨大的影响。然而,获取有效的产品评论并不容易,许多卖家为了提高自己产品在同类别中的竞争力,选择进行测评。测评可以快速提高产品的排名、权重和销…

2万字实操入门案例之在Springboot框架下用Mybatis简化JDBC开发实现基础的操作MySQL之预编译SQL主键返回增删改查

环境准备 准备数据库表 use mybatis;-- 部门管理 create table dept(id int unsigned primary key auto_increment comment 主键ID,name varchar(10) not null unique comment 部门名称,create_time datetime not null comment 创建时间,update_time datetime not null comme…

微信小程序之九宫格抽奖

1.实现效果 2. 实现步骤 话不多说&#xff0c;直接上代码 /**index.wxml*/ <view class"table-list flex fcc fwrap"><block wx:for"{{tableList}}" wx:key"id"><view class"table-item btn fcc {{isTurnOver?:grayscale…

使用API有效率地管理Dynadot域名,默认将域名隐形转发至其他界面

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

[通俗易懂]《动手学强化学习》学习笔记3-第5-13章

文章目录 前言小总结&#xff08;前文回顾&#xff09;问题1&#xff1a;问题2&#xff1a;问题3&#xff1a;补充一点 0.26.2版本gym环境问题 前言 参考&#xff1a; 《动手学强化学习》作者&#xff1a;张伟楠&#xff0c;沈键&#xff0c;俞勇 动手学强化学习 网页版 动手学…

思科期末大作业

计算机网络&#xff0c;可代写网络作业&#xff0c; 思科cisco模拟器&#xff0c;eve&#xff0c;制作校园局域网、企业局域网&#xff0c;实现路由交换、单臂路由、冗余、ACL、Nat、PAT、DHCP,RIP,OSPF,pppoe等技术&#xff0c;价格合理&#xff0c;详细私聊

Minio 对象存储 OSS概述

系列文章目录 第五章 Minio 对象存储 OSS概述 Minio 对象存储 OSS概述 系列文章目录对象存储 OSS基本概念存储空间&#xff08;Bucket&#xff09;对象&#xff08;Object&#xff09;ObjectKeyRegion&#xff08;地域&#xff09;Endpoint&#xff08;访问域名&#xff09;Ac…

Qt自定义QpushButton分别在c++/python中实现

//.h文件#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QPainter> #include<QMouseEvent> #include<QPropertyAnimation> #include<QResizeEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; }class Widget : public QWi…

MATLAB图形绘制

文章目录 图形绘制二维图形绘制plotfplot 坐标轴设置函数/同一窗口分区subplotaxis添加标注 单对数坐标图三维图形绘制mesh 图形绘制 图形绘制的基本步骤&#xff1a; 数据准备&#xff1a;主要工作是产生出自变量采样向量&#xff0c;计算相应的函数值向量选定图形窗口及子图…

【全开源】云界旅游微信小程序(源码搭建/上线/运营/售后/维护更新)

开启您的云端旅行新体验 一、引言 在快节奏的现代生活中&#xff0c;旅行成为了人们放松身心、探索世界的重要方式。让您的旅行更加便捷、高效&#xff0c;打造了云界旅游小程序&#xff0c;带您领略云端旅行的无限魅力。 二、小程序功能概览 云界旅游小程序集成了丰富的旅游…

Electron学习指导

Electron学习指导 一、开始上手 1.1介绍 Electron Chromium Node.js Native APIs 官方说&#xff1a; Electron 是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创…

FENDI CLUB啤酒,为何女生喜欢?

精酿啤酒已经成了女生喜欢的饮品&#xff0c;在日剧《无法成为野兽的我们》里&#xff0c;主人公小晶永远保持标准笑容&#xff0c;完美完成所有的工作。只有一个人的时候&#xff0c;她才会放下习惯性的微笑&#xff0c;显露自己的疲惫。小晶缓解疲惫&#xff0c;就是下班后去…

【C语言深度解剖】:(11)函数指针、函数指针数组、指向函数指针数组的指针、回调函数

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》《精通C指针》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多C语言深度解剖点击专栏…

Django Celery 的配置及使用---最详细教程

Django Celery 的配置及使用 Redis提供队列消息功能 一、安装redis 系统版本&#xff1a;Ubuntu 20.041、获取最新软件包 sudo apt update sudo apt install redis-server2、安装完成后&#xff0c;Redis服务器会自动启动。查看redis是否启动成功 sudo systemctl status …

JVM运行时内存:虚拟机栈

文章目录 1. 概述2. 栈针3. 栈针内部结构3.1 局部变量表3.2 操作数栈3.3 动态链接3.4 方法返回地址3.5 一些附加信息 运行时内存整体结构如下图所示: 1. 概述 如何理解栈管运行&#xff0c;堆管存储&#xff1f; 角度一&#xff1a;GC;OOM角度二&#xff1a;栈、堆执行效率角…

信息管理系统升级改造项目:需求分析工具与实践

关键词&#xff1a;出入境信息管理系统、升级改造项目、需求分析实践、逆向工程、PowerDesigner、Axure Pro、信息系统优化策略 文章重点&#xff1a;本文以出入境信息管理系统的升级改造项目为背景&#xff0c;详细阐述了信息系统需求分析的实践过程&#xff0c;特别是如何通过…

Python实现缓存机制库之cachetools使用详解

概要 在数据密集型应用中,缓存是优化性能和响应速度的关键技术之一。Python的cachetools库提供了一套灵活且强大的工具,用于在Python项目中实现缓存机制。本文将全面介绍cachetools的安装、特性、基本与高级功能,并结合实际应用场景,展示其在项目中的应用。 安装 安装cac…

文字游侠AI丨简直是写作神器,头条爆文一键生成稳定赚米!附渠道和详细教程(只需四步)!

在数字时代的浪潮中&#xff0c;人们不断寻求网络空间中的商机&#xff0c;期望在互联网的浩瀚海洋里捕捉到稳定的财富。随着人工智能技术的突飞猛进&#xff0c;越来越多的AI工具被融入到各行各业&#xff0c;开辟了新天地&#xff0c;带来了创新的盈利模式。 其中&#xff0c…

PCB供电夹子DIY

在刷小红书的时候&#xff0c;看到了清华卓晴教授【https://zhuoqing.blog.csdn.net/】DIY的供电夹子&#xff0c;感觉对于自己DIY PCB的时候供电会比较方便&#xff0c;物料也比较简单&#xff0c;打算复刻一下。 使用物料 1、小夹子&#xff0c;文具店都有卖&#xff0c;选…