【Java】Java 中的引用类型

news2024/9/20 16:29:44

本文仅供学习参考!

Java是一种类型化语言,这本质上意味着声明的每个变量都有与之关联的特定类型。此类型确定它可以存储的值。例如,整数类型可以存储非小数。也称为数据类型,这可以大致分为两类:基元引用。基元类型是最常见的,它们构成了类型声明的基础,引用类型是那些不是基元类型的类型。稍后将在本文中详细介绍这些引用类型;但首先,稍微绕道而行。

Java 中的静态和动态类型是什么?

如果在编译代码之前已知声明的变量的类型,则认为语言是静态类型的。对于某些语言,这通常意味着程序员在使用变量之前需要在代码中指定变量的类型(例如 - Java,C,C++)。其他人提供了一种类型推断形式,能够推断变量的类型(例如 – Kotlin,Scala,Haskell)。显式类型声明的优点是,在早期阶段可以快速捕获琐碎的错误。

另一方面,动态类型意味着程序员不需要声明任何类型的变量,只需开始使用它们即可。类型是根据它存储的值动态确定的。这是一种更快的编码方式,因为变量可以存储不同类型的值 - 例如,数字字符串 - 而不必为它们的类型声明而烦恼(例如 - Perl,Ruby,Python,PHP,JavaScript)。类型是在旅途中决定的。大多数脚本语言都具有此功能,主要是因为在任何情况下都没有编译器来执行静态类型检查。但是,这使得查找错误有点困难,特别是如果它是一个大程序,尽管这种类型的脚本通常具有较小的代码,因此错误隐藏的地方较少。

有些语言(如流氓)采用两种方法(静态动态)。有趣的是,Java 10引入了var关键字。声明为 var 的变量根据其存储的值自动检测其类型。但是,请注意,一旦分配了值,编译器就会在编译期间指定其类型。以后,它们不能与代码行中的另一种类型重用。下面是如何在 Java 中使用 var 关键字的示例:

var iVar = 12;
var dVar = 4.678;
var cVar = 'A';
var sVar = "Java";
var bVar = true;

Java 中的基元类型和引用类型有什么区别?

在 Java 中,由于所有非基元类型都是引用类型,因此将对象指定为类实例的类也被视为引用类型。为了进行比较,以下是基元类型相对于引用类型的典型特征:

  • 它可以存储其声明类型的值。
  • 分配另一个值时,将替换其初始值。
  • 对于所有基元类型,其内存占用都有特定的限制。
  • 默认情况下,它们是初始化的(值为 0 的数字,具有值的布尔值)
  • 它们可以在声明期间显式初始化(*int tot=10;*)
  • 声明的本地基元类型变量永远不会初始化,因此在 Java 中不允许在初始化之前尝试使用它们。

引用类型的一些特征如下:

  • 除基元之外的所有其他变量都是引用类型
  • 引用类型在计算机内存中存储对象的引用或位置。此类变量引用程序中的对象。
  • 类的对象或具体实例是使用构造函数调用后面的 new 关键字创建的。构造函数是类的特殊成员函数,用于通过使用各自的默认值或作为构造函数参数接收的值初始化类中声明的所有变量来创建对象。
  • 类实例是通过调用类构造函数创建的,可以有多个。
  • 尽管无法实例化接口引用,但可以将扩展接口的类的实例分配给接口类型的引用。

Java 引用类型教程

Java 中变量和引用类型的地址

与 C/C++ 不同,我们可以通过指针仔细查看变量的内存地址和引用,Java 在这里完全沉默。Java 语言中没有任何元素可以获取变量的地址。这就是为什么语言结构中没有地址或类似的运算符的原因;该语言从头开始设计为无需它即可工作。这完全关闭了 Java 中指针的大门。

但是,如果我们如此热衷于接近内存 - 或者更确切地说,接近Java中的内存抽象 - 请使用引用类型。引用类型实际上不是内存地址,但可以紧密转换为内存地址。无论如何,它们与指针具有相似的氛围,并且可以像任何其他变量一样对待它们。

Java 中的接口参考

在 Java 中,接口不能实例化。因此,不能直接引用它。但是,扩展接口的类类型的对象可用于分配该接口类型的引用。在下面的示例中,教授不仅派生自 Person 类,还派生自两个接口:教师研究人员

因此,根据该语句,以下层次结构是有效的:

Java 引用类型代码示例

因此,以下 Java 代码示例可以很好地编译:

public class Main{
    public static void main(String[] args){
        Professor professor = new Professor("112233", "Donald Ervin Knuth", Date.valueOf(LocalDate.of(1938,1,10)), 9.8f);
        Person person = new Professor("223344", "Dennis Ritchie", Date.valueOf(LocalDate.of(1941,9,9)),9.7f);
        Teacher teacher = new Professor("223344", "Andrew S Tanenbaum", Date.valueOf(LocalDate.of(1944,3,16)),9.6f);
        Researcher researcher = new Professor("223344", "Ken Thompson", Date.valueOf(LocalDate.of(1943,2,4)),9.5f);
    }
}

在这里,教授类型的四个对象被分配给不同的引用类型,这些类型还包括两个接口引用类型。假设引用类型的堆栈和堆内容如下所示:

Java 代码示例

以下参考也同样可行:

Professor professor = new Professor("112233", "Donald Ervin Knuth", Date.valueOf(LocalDate.of(1938,1,10)), 9.8f);

Person person = professor;
Teacher teacher = professor;
Researcher researcher = professor;

在这种情况下,堆栈和堆内存将如下所示,其中一个对象具有多个引用:

Java 堆栈和堆内存

但是,请注意,引用必须是已分配对象的超类型。这意味着以下赋值无效(并且不会编译):

person = professor; //valid
professor = person; //invalid

这样做的原因是引用用于调用在类中声明的公共方法。因此,引用指向的对象必须能够访问这些方法。在这里,参考教授无法访问一个人的财产。结果,Java 编译器抱怨分配。一些智能代码编辑器和 IDE 也能够在编译之前识别无效性并标记消息并警告程序员。

但是,可以使用显式转换来说服编译器一切正常:

professor = (Professor)person; //valid

END

默认情况下,引用类型实例初始化为值 nullnull 是 Java 中的保留关键字,这意味着引用类型指向内存中的任何内容。在 Java 中没有指针的一个方面是,在大多数情况下,引用类型几乎可以像对待任何其他变量一样处理。指针有一个奇怪的外观,许多程序员不喜欢这个原因(但有些人还是喜欢它)。放下程序员的手,仍然有一个指向内存中的对象的引用 - 你会得到Java引用类型。

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

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

相关文章

华为云GaussDB,能否成为数据库国产化替代的“更优选择”?

没有一个行业比数据库更需要长期主义,而在践行长期主义的道路上,国内数据库厂商中华为是不可忽视的存在。 近日,Gartner Peer Insights《Voice of the Customer for Cloud Database Management Systems,2023》报告发布&#xff0…

使用python unittest从零构建web应用的自动化测试用例

文章目录 必要性使用pycharm搭建unittest框架selenium下载web driverweb driver的基本使用driver 定位元素driver使用事件处理下拉框处理复选框 sshftp数据库sqlserveroracle安装使用 mongodb excelpycurl 必要性 大部分团队起始对于要不要投入资源进行UI自动化测试的开发都是…

泰裤辣!Corona 10强势来袭,蓝海创意云同步更新支持

2023年6月22日,Chaos Corona官网发布了Chaos Corona 10 for 3ds Max and Cinema 4D版本。本次不仅更新了新功能,还优化了渲染卡顿的问题,一起来看看有哪些实用的好玩意吧! 1.贴花影响特定通道 CR10在你的场景中焕然一新&#xff…

Git报错: Please move or remove them before you switch branches.

Bug记录:在我写需求的时候,产品说上个包有崩溃,于是我就控制台 git checkout切分支,结果报错Please move or remove them before you switch branches.下面是被改动的文件,因为是项目build的时候产生的临时文件&#x…

在虚幻引擎中创建大气的HIMIL电影作品

今天瑞云渲染小编给大家带来了关于电影制片人Tiziano Fioriti展示了《H I M I L》项目背后的工作流程,解释了人工智能是如何用于细节的,并谈到了设置火光的问题。 介绍 大家好,我叫Tiziano Fioriti,是来自意大利的自由电影制作人…

RabbitMQ管理界面介绍

1.管理界面概览 connections: 无论生产者还是消费者,都需要与RabbitMQ建立连接后才可以完成消息的生产和消费,在这里可以查看连接情况 channels: 通道,建立连接后,会形成通道,消息的投递获取依…

高阶常系数微分方程——笔记整理

首先,介绍基本知识: 首先,我们对式子进行处理得到: 得到特征根是 和 0, 所以其通解 假设特解是,带入方程所得:

Nik Color Efex 滤镜库

Nik Color Efex 滤镜库中提供了 55 个滤镜。有关这些滤镜的详细参数说明请分别参阅: 1 ~ 11 《Nik Color Efex 滤镜详解(1/5)》 12 ~ 22 《Nik Color Efex 滤镜详解(2/5)》 23 ~ 33 《Nik Color Efex 滤镜详解&#x…

2023年java还是golang还是c#?

前言 我们可以先来看一下这三门语言各自的优劣 学习曲线:如果你是初学者或对编程相对陌生,Java可能是一个较好的选择。它有广泛的学习资源和社区支持,易于上手。Go也有简单易学的特点,但由于相对较年轻,相关的学习资…

为何收入或存款增量难找存量告急

其实,和年纪关系不太大吧,平凡的普通人都没多少存款。 *近日,有调查称“大概五分之一的年轻人存款在一万元以内。10万元存款是一个“坎”,存款超过10万就会超过53.7%的人。”“年轻人”“存款”两个词碰撞在一起,引来了…

python3中http协议提供文件服务器功能

http协议是互联网的通用基础协议,也可以利用其来开发文件服务器,给客户提供文件浏览,查看,下载,上传等功能。 目录 1.python3自带http文件服务 2.python3从头开发http文件服务 1.python3自带http文件服务 python3中…

资源调度框架 YARN

3.1.1 什么是YARN Yet Another Resource Negotiator, 另一种资源协调者通用资源管理系统为上层应用提供统一的资源管理和调度,为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处 3.1.2 YARN产生背景 通用资源管理系统 Hadoop数据分布式存储&#xff08…

【打杂记录】-能否开发一个报账系统,自动批量识别与完成报账任务?

能否开发一个报账系统,自动批量识别与完成报账任务? 今天这篇博客,我想说些非技术性语言。我在研二一年负责实验室的报账工作,近期终于有机会将工作交接给下一位负责人,我的科研时间又回来了。 在这一年里&#xff0c…

centos7 挂载未分配的空间新增卷

一、系统环境 操作系统:Centos 7 已配置环境:空 二、磁盘挂载到新目录(磁盘挂载) 2.1 查找新硬盘 查看机器所挂硬盘及分区情况: fdisk -l 复制 红框圈中的即是本次要挂载的磁盘,与 /dev/sda 和 /de…

掌握多线程的用法一篇就够了

多线程 线程与进程进程线程线程调度速度问题 创建线程的方式第一种:继承Thread类原理分析 第二种:实现Runnable接口的形式第三种:有返回值的线程 Thread类的方法Thread和Runnable的区别线程安全问题举例测试代码线程安全问题分析案例解决办法分析方案一:使用同步代…

SpringSecurity基础入门详解

【1】SpringSecurity是什么 Spring 是非常流行和成功的 Java 应用开发框架,Spring Security正是Spring家族中的成员。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。 正如你可能知道的关于安全方面的两个主要区域是“认…

使用英特尔 oneAPI AI 工具分析包实现AI应用程序的调试与改进

目录 1.什么是英特尔 oneAPI AI? 关于英特尔 oneAPI AI 工具分析包 2.使用英特尔 oneAPI AI 工具分析包实现AI数据分析 准备工作 数据准备 编写AI应用程序 性能分析 并行性优化 内存和线程错误分析 优化AI算法 性能验证与调试 性能优化迭代 3.总结 1.什…

「2024」预备研究生mem-概率基础加法公式乘法公式古典概型基础

一、概率基础 二、加法公式 三、乘法公式&古典概型基础 均不是1点 除了不是1的概率 不全是1点:也有可能是1点, 理解为 对是1点取非 相互独立 相乘 古典概型: 从A出发,先到B, 先到D,先到C(…

记录字符串压缩

参考代码 class Solution { public:string num2str(int val){string ans;while(val/10){ans.push_back((char)(0val%10));val/10;}ans.push_back((char)(0val%10));return ans;}string compressString(string S) {string ssS;S.push_back(\n);int left0,right1;int n S.size(…

数字孪生场景渲染能力中的WebGL技术路线

使用三维建模技术构建出的虚拟现实场景后,需要通过渲染引擎实现场景的高精度、高保真和实时渲染。同时,需要将现实场景中的数据信息融合到虚拟场景中,实现对现实情况的监测和控制。 目前大多数数字孪生城市项目在三维渲染引擎的技术选型上通…