java不可变类型_Java中的值类型:为什么它们不可变?

java不可变类型

值类型不必是不变的。 但是他们是。

在上一篇文章中,我讨论了Java中指针与引用之间的区别以及如何传递方法参数(按值传递或按引用传递)。 这些与Java中尚不存在的值类型密切相关(尚未)。

John Rose,Brian Goetz和Guy Steele 提出了一个建议 ,详细介绍了值类型将如何/可能在Java中工作,并且还有一些很好的文章。 我已经阅读了我非常喜欢的“值类型:改造Java的类型系统” ,我建议阅读。 如果建议过于密集,以至于您无法关注该主题,则可以先阅读该文章。 它非常概括了背景,值类型是什么,优点,为什么Java不实现值类型是一个问题以及为什么它不是琐碎的问题。 即使术语“值类型”也可以用来表示不同的东西,我也会在提案和文章中使用它。

我们如何传递参数与我们在变量中存储什么

您可能还记得上一篇文章,我详细介绍了Java根据参数的类型按引用或按值传递方法参数:

  • 当参数是对象时传递引用
  • 参数为原始值时按值排序。

在原始帖子上以及在JCG重新发布 上都有一些评论,这些评论抱怨我关于通过引用传递论点的术语。 注释指出,参数总是按值传递,因为变量已包含对对象的引用。 实际上,变量包含位。 即使了解我们如何想象这些位以及在交流时使用什么术语,这一点很重要。 我们可以说

  1. 类变量包含对象,在这种情况下,我们通过引用将这些对象传递给方法
  2. 或者我们可以说变量包含引用,在这种情况下,我们传递变量的值。

如果我们遵循思想#1,则根据参数(对象或基元)的实际性质,参数传递是按值和/或按引用。 如果我们遵循思想#2,则变量将根据其类型的性质存储参考和/或值。 我个人想写的时候

Triangle triangle;

则可变triangle是三角形,而不是对三角形的引用。 但这与我的大脑到底有什么关系并不重要。 在情况#1或#2中,对于类类型和基元都有不同的方法。 如果我们在语言中引入值类型,则区别将变得更加普遍和易于理解。

值类型是不可变的

我解释说,基于类型的隐式参数传递不会引起任何问题,因为基元是不可变的,因此,当作为方法参数传递时,即使通过引用传递它们也无法更改。 所以我们通常不在乎。 值类型没有不同。 值类型也是不可变的,因为它们是值,并且值不变。 例如,PI的值为3.145926…,并且它永远不会改变。

但是,这种不变性在编程中意味着什么? 值可以是实数,整数或复合值类型,它们在内存中均以位表示。 可以更改内存中的位(除非内存是ROM)。

在对象不变的情况下,相当简单。 宇宙中某个地方有一个我们无法改变的物体。 可能有许多保存对象的变量(对其有一个引用),并且代码可以依赖于这样的事实,即表示对象实际值的存储位置中的位不变(或多或少)。

在值类型的情况下,这有点不同,并且这种差异是由于相同位在表示对象时对表示值类型的位的解释不同。

值类型没有身份

值类型没有身份。 您不能有两个保存值3 int变量并区分另一个。 它们具有相同的价值。 当类型更复杂时,也是如此。

假设我有一个具有两个字段的值类型,例如

ValueType TwoFields {int count;double size;}

说我有两个变量

Twofields tF1 = new TwoFields(1,3.14)Twofields tF2 = new TwoFields(1,3.14)

我不能告诉其他变量tF1tF2 。 如果他们的对象,他们是equals彼此但不==对方。 对于值类型,没有==因为它们没有身份。

如果TwoFields是不可变的类,我不能或不应该写

TwoFields tF;...tF.count++;

或一些类似的结构。 但我仍然可以写

TwoFields tF;...tF = new TwoFields(tF.count+1, tF.size)

保持原始对象不变。 如果TwoFields是值类型,则无论哪种构造,都将创建一个新值。

值类型作为参数

值类型如何作为方法参数传递呢? 可能将值复制到参数变量。 可能会传递一些参考。 但是,这取决于编译器(是Java还是其他语言)。 为什么?

  • 值类型通常很小。 至少它们应该很小。 巨大的值类型失去了值类型提供的优点,但有缺点。
  • 值类型是不可变的,因此像原始类型一样复制它们没有问题。 可以按值传递它们的方式与“ Java的所有内容都按值传递”的方式相同。
  • 它们没有身份,不能引用它们。

但这不仅是将它们作为参数传递。 这也是分配变量的方式。 看代码

Twofields tF1 = new TwoFields(1,3.14)Twofields tF2 = new TwoFields(1,3.14)

比较一下

Twofields tF1 = new TwoFields(1,3.14)Twofields tF2 = tF1

如果TwoFields是值类型,则两个版本之间应该没有区别。 它们必须产生相同的结果(尽管在编译时可能不会通过相同的代码)。 在这方面,参数传递和变量赋值之间没有真正的区别。 即使实际变量作为位包含对存储值的某些存储位置的某些引用,也会复制值。

摘要

在我开始撰写本文时:值类型不必是不变的。 这不是语言设计师决定的事情。 他们可以自由地实现可变的东西,但是在那种情况下,它将不是值类型。 值类型是不可变的。

翻译自: https://www.javacodegeeks.com/2016/01/value-types-java-immutable.html

java不可变类型

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

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

相关文章

六步创建TCP服务端

//六步创建TCP服务端 #include<iostream> #include<Windows.h> using namespace std;int main() {//初始化ws2_32.dllWORD ver MAKEWORD(2, 2);WSADATA wsaData;WSAStartup(ver, &wsaData);//对应WSACleanup的调用//1.建立一个socketSOCKET _sock ::socket(A…

计算机控制cs,计算机控制

计算机控制锯齿波形源码CODESEGMENTASSUME CS:CODESTART:MOV AX,8100H ;数据段MOV DS,AXMOV AX,7000H ;8251串口寄存器&#xff0c;存储空间 7000H:8000HMOV ES,AXXOR AL,ALWAVE:XOR DX,DX ;0832口地址 0000HOUT DX,ALINC ALMOV AH,AL;保存AL内容MOV DX,0…

返回路径平面上的间隙_裁切机的上刀下刀如何调整?

每天都在使用裁切机时&#xff0c;由于各种因素往往会出现上刀、下刀现象(也称凸刀、凹刀现象)&#xff0c;给后面的套准带来困难。在此小编对上刀、下刀现象的产生原因做一分析与总结。01千斤压力不够(1)机械压力弹簧弹力不够。此时必须增大压力&#xff0c;如果增大到最大位置…

spring-bean版本_如何模拟Spring bean(版本2)

spring-bean版本大约一年前&#xff0c;我写了一篇博客文章如何模拟Spring Bean 。 所描述的模式对生产代码几乎没有侵入性。 正如读者Colin在评论中正确指出的那样&#xff0c;基于Profile注释的间谍/模拟Spring bean是更好的选择。 这篇博客文章将描述这种技术。 我在工作中以…

四步创建TCP客户端

//四步简历TCP服务端 #include<iostream> #include<Windows.h> using namespace std;int main() {//初始化ws2_32.dllWORD ver MAKEWORD(2, 2);WSADATA wsaData;WSAStartup(ver, &wsaData);//对应WSACleanup的调用//1.建立一个socketSOCKET _sock ::socket(A…

pcb板材的tg是什么_做到这6点,PCB过回焊炉不会出现板弯及板翘!

【维文信PCBworld】在PCB板子过回焊炉容易发生板弯及板翘&#xff0c;大家都知道&#xff0c;那么如何防止PCB板子过回焊炉发生板弯及板翘&#xff0c;下面就为大家阐述下&#xff1a;1.降低温度对PCB板子应力的影响既然「温度」是板子应力的主要来源&#xff0c;所以只要降低回…

计算机编程试讲教案,2016教师资格证面试试讲高中信息技术教案:QBASIC分支结构程序...

更多真题资料及报考疑问请加老师微信66746005&#xff0c;或点击这里在线咨询教师资格证面试时间临近&#xff0c;推荐报名教师资格证面试网校高清课程(点击购买&#xff0c;随报随学&#xff0c;不限时间次数。免费试听)&#xff0c;来系统学习提升面试技能。关于教师资格证面…

java-ee-api_刷新器-Java EE 7概览

java-ee-api随着红帽JBoss企业应用平台7&#xff08;EAP 7&#xff09;的迫在眉睫&#xff0c;甚至WebLogic Server刚刚获得Java EE 7认证&#xff0c;我认为现在应该是时候对Java Enterprise Edition 7进行一些更新了。功能&#xff0c;并指向更多资源。 Java EE 7 –开发人员…

创建进程(CreateProcess)

下面来分享一下如何用C创建进程&#xff08;开发环境建议VS2017【宇宙第一IDE】&#xff09; /*以下为创建新的进程&#xff0c;以拉起记事本为例*/ #include <windows.h> #include <iostream> using namespace std; int main() {char TEST[] "notepad.exe…

层 数据仓库_小尝试:基于指标体系的数据仓库搭建和数据可视化

关于作者&#xff1a;小姬&#xff0c;某知名互联网公司产品专家&#xff0c;对数据采集、生产、加工有所了解&#xff0c;期望多和大家交流数据知识&#xff0c;以数据作为提出好问题的基础&#xff0c;挖掘商业价值。0x00 前言我将整理文章分享数据工作中的经验&#xff0c;因…

计算机中级职称报考入口,2020年9月计算机职称考试报名流程(附入口)

2020年9月计算机等级报名公告正在陆续公布&#xff0c;计算机等级考试网上怎么报名&#xff1f;小编为大家整理计算机等级报名流程如下&#xff1a;2020年9月计算机等级报名流程一、注册通行证考生登入报名网页后&#xff0c;点击“用户注册”按钮&#xff0c;根据网页提示&…

简单工厂抽象工厂工厂方法_让工厂美丽

简单工厂抽象工厂工厂方法每个名副其实的Java程序员都知道Factory Pattern 。 这是一种便捷&#xff0c;标准化的方法&#xff0c;它通过教一个组件如何捕鱼而不是将它们交给它们来减少耦合。 但是&#xff0c;在使用大型系统时&#xff0c;该模式确实会向系统添加很多样板代码…

枚举所有进程及其ID

#include<Windows.h>#include<TlHelp32.h> //声明快照函数的头文件#include<stdio.h>int main(int argc, char*argv[]){system("color 0A"); //设置底色PROCESSENTRY32 pe32; //声明该结构体变量//在使用这个结构前&#xff0…

内蒙古大学计算机组成原理实验,内蒙古大学计算机组成原理期末练习0

内蒙古大学计算机组成原理期末练习0 (4页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;9.9 积分第 1 页 共 4 页 《《计算机组成原理计算机组成原理》》期末练习期末练习 班级 专业 姓名 学号 编号 …

dev的编辑器不支持getchar吗_“两头婚兴起”:你支持不娶不嫁,孩子随父姓也随母姓吗?...

何为两头婚&#xff1f;简单来说就是男不娶&#xff0c;女不嫁&#xff0c;没有彩礼也没有嫁妆的说法。男女俩人结婚之后没有谁到谁家里之说&#xff0c;两夫妻过自己的小日子&#xff0c;与各自的原生家庭保持一定的联系。婚后生育两个孩子&#xff0c;一个随父姓&#xff0c;…

字符串操作之字符串拷贝功能实现

#include<iostream> using namespace std; //思路分析&#xff1a; //a.确定被拷贝的数组内存是否小于等于目标数组的内存大小 //b.拷贝数组 //c.目标数组最后一个字符为空字符(\0)//str1:被拷贝的数组 str2:目标数组 len:目标数组的长度 bool stringCopy(char* str1, ch…

2015年传智播客java_2015年的Java –重大事件

2015年传智播客java2015年是Java的一年&#xff0c;语言&#xff0c;平台&#xff0c;生态系统和社区继续主导着软件领域&#xff0c;只有Javascript对整个行业产生了类似的影响。 如果您错过了2015年的亮点&#xff0c;这里是发生的一些重大事件。 Java 20岁了&#xff0c;还…

vue 删除两个集合中相同的数据_vue.js如何删除数组里面的数据

vue.js如何删除数组里面的数据发布时间&#xff1a;2020-12-10 12:04:44来源&#xff1a;亿速云阅读&#xff1a;107作者&#xff1a;小新这篇文章主要介绍了vue.js如何删除数组里面的数据&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文…

字符串操作之字符串连接

/* 将str1与str2连接—->(将合成的字符串放入str1中) 思路分析: a. 确定str1的内存大小是否小于str1str2-1; b. 连接; c. 连接后的字符串最后一个为空字符(‘\0’)。 */ //str1-->存放最终连接字符串的数组 ,len--->str1的内存大小 #include<iostream> using na…

全国计算机证件照要露耳朵吗,结婚证照片要露耳朵么 结婚登记照露一只耳朵行吗...

结婚证件照&#xff0c;这是可以在在民政局里面照的&#xff0c;也是可以在外面的影楼照的&#xff0c;在外面影楼照的话&#xff0c;照出来会比较好看&#xff0c;就是价格有点贵。结婚证上面的照片是证件照&#xff0c;所以是有一定的要求的。露一只耳朵行不行呢&#xff1f;…