从零辅助篇1:java中常量的赋值问题
衔接:这里主要是针对从零开始学java系列第一季第五期:运算符和表达式中递增递减运算中的一个常量的赋值说明
1、java中常量的赋值问题
在java中,我们知道,一个整数默认为int类型,由此呢?我们引发出了一个问题?
byte类型为什么赋值一个整数不会报错
下面我们来看一个例子:
同为byte类型的b1和b2的和却无法赋值给b3
b5如果赋值一个整数不会报错,但加上一个byte类型的数却会报错
对于b5,你可能还能解释:15默认为int类型,b1是byte类型,一个低级类型和一个高级类型进行运算,低级类型会自动向高级类型转换,那么b1+15的结果实际上是一个int类型的,那么也就无法赋值给byte类型的b5了
那么,对于b3的同类型无法赋值和一个整数常量,明明默认是int类型,为什么却可以赋值给byte类型?
针对上面的问题,我们先来看看b3处的报错信息:
它给我们的提示信息是类型错误,也就是说两个byte类型的数据相加之后的结果竟然变成了int类型;
要了解清楚这个问题的原因,必须要从Java虚拟机的指令集说起,每种指令代表了一种操作。
首先要说明的是:
在Java虚拟机中,对于大部分与数据类型相关的字节码指令,他们的操作码助记符中都有特殊的字符来表示专门为哪种数据类型服务.
但是Java虚拟机的操作码长度只有一个字节,这就带来一个问题,如果每种与数据类型相关的指令都支持Java虚拟机运行时数据类型的话,显然一个字节就不够用了。 所以Java虚拟机规范中,这种特性"Not Orthogonal",并非每种数据类型和每一种操作都有对应的指令。
大部分的指令都没有支持byte、char、short,没有任何指令支持boolean类型。编译器在编译期或者运行期将byte和short类型的数据带符号扩展为相应的int类型数据,将boolean和char类型数据零位扩展为相应的int类型数据。与之类似的,在处理byte、char、short和boolean类型的数组时,也会转换成对应的int类型的字节码指令来处理。因此,大多数对于byte、char、short和boolean类型数据的操作,实际上都是使用相应的int类型作为运算类型的。
参考书籍:《深入理解Java虚拟机:JVM高级特性与最佳实践》(第三部分,第6章,6.4.1小节:P197-P199 关于Java虚拟机指令集所支持的数据类型相关的内容)
通俗来说:就是在java虚拟机中有一个字节码指令,这些指令中的操作码可以用来为某一种数据类型服务,但这些操作码只有一个字节的长度,当一个数据类型支持多个数据类型相关的指令的时候,那么一个字节肯定是不够用的,比如一个常量10,它即支持int,还支持byte、short。,这时候就会将它们扩展为相应的int类型,所以呢,byte+byte实际上结果为int类型!
还有一种通俗的说法就是两个byte很容易超出byte所能存储的最大范围127,所以呢java虚拟机为其进行了数据类型转换。
另外呢,对于为什么byte能赋值常量整数这个问题,我这里借鉴一下其他的文章
首先,整数类型默认是int。这个毫无疑问。 其次,在允许的类型范围内,在此处byte:-128~127 而整数int 1 在这个范围,编译器会对常量自动进行向下的转化。 如果超出这个范围的常量,编译器直接报错。
还有一点需要提的就是,对于递增递减运算符来说,比如
byte b = 0;b++;
对于这里的b++来说,JVM会自动帮我们对b+1的结果进行一个强制转换,byte类型也是可以使用递增递减运算符的
引用资料:https://www.it1352.com/708803.html
从零辅助篇1:java中常量的赋值问题相关推荐
- Java中需要全部小写的是,下列哪些是Java中常量的命名约定?A、全部为小写字母B、全部为大写字母C、大小写混合D、字与字之间...
下列哪些是Java中常量的命名约定?A.全部为小写字母B.全部为大写字母C.大小写混合D.字与字之间 更多相关问题 She knew so many men who had been trained ...
- 【搞定Java并发编程】第24篇:Java中的并发工具类之CountDownLatch
上一篇:Java中的阻塞队列 BlockingQueue 详解 本文目录: 1.CountDownLatch的基本概述 2.CountDownLatch的使用案例 3.CountDownLatch的源 ...
- JAVA中常量使用常量类或者常量接口还是使用枚举,错误代码和中文可变信息的枚举实现
文章目录 关于"JAVA中常量使用常量类或者常量接口还是使用枚举",已有定论-使用枚举,原因就不再展开了. 借助java枚举,可以在定义错误名称和代码的同时,定义中文描述信息,但是 ...
- 【基础巩固篇】Java中String揭秘!
作者:不清不慎,Java大数据开发工程师一枚,热爱研究开源技术! 架构师社区合伙人! String对象是我们日常使用的对象类型,字符串对象或者其等价对象(如char数组),在内存中总是占据了最大的空间 ...
- java中常量有初始化值吗,java的变量和常量
Java常用变量: Java标识符: 使用标识符时,需要遵守几条规则: 1. 标识符可以由字母.数字.下划线(_).美元符($)组成,但不能包罗 @.%.空格等其它特殊字符,不能以数字开头.譬如:1 ...
- Java中常量定义在interface和class的区别(转)
最终结论:定义常量在interface和class中其实都行,关键是看你的设计和个人爱好. Java中interface中定义变量默认都是"public static final" ...
- java中常量_Java中的常量有哪些?
JAVA常量就是在程序中固定不变的值,是不能改变的数据.例如数字1.字符"a".浮点数3.2等.那么java的常量有哪些呢?在Java中,常量包括整型常量.浮点数常量.布尔常量.字 ...
- java中常量final的用法_详解Java中final的用法
本文主要介绍了Java中final的使用方法,final是java的关键字,本文就详细说明一下它的使用方法,需要的朋友可以参考下 概念 final 具有"不可改变的"的含义,可以修 ...
- java中常量定义在interface中好还是定义在class中
Java中interface中定义变量都是"public static final" 类型的, 也就是常量, 因此很多人在interface定义常用的常量,除此之外单独定义一个cl ...
最新文章
- 首款AI看球机器人亮相北京,已上线IOS版和安卓版
- java冒泡遍历对象_Java经典排序算法(冒泡、选择、插入)
- c语言 链表_C语言编程第22讲——单向有序链表的C语言实现
- emacs php 配置文件,如何配置emacs进行正确的PHP开发?
- Shell脚本编程基础笔记一
- MS SQL Server带有时间的记录怎样查询
- Golang QRCode 生成实现
- 使用coin3d画个小模型
- 微信之父张小龙经典演讲164页PPT:《微信背后的产品观》
- hge引擎配置登录器教程_HGEM2引擎登录器列表格式TXT
- 12C RAC重装无法识别磁盘组(AFD新特性)
- 【论文笔记】Understanding Software Changes: Extracting, Classifying, and Presenting Fine-Grained Source Co
- win10 批量修改文件权限
- Troubleshooting Office Web Apps with SharePoint 2013
- JVM:这次一定要搞懂字节码
- 武汉大学计算机技术VB试题,武汉大学VB考试题库.doc
- 怎么用计算机玩超级玛丽,玩家在《超级马里奥制造2》里做出了计算器 计算过程太神奇...
- 540. 有序数组中的单一元素
- 用TypeScript、JavaScript实现PDF转图片
- IMX8M学习--MYZR-i.MX 8M-EVK(一)
热门文章
- 再论设立“永中软件”的非法性
- R语言 for循环之break,next
- 项目组织机构之职能型、项目型、矩阵型(强/平衡/弱)
- 基于python的车辆轨迹研究_highD:德国提出从空中角度测量车辆数据的新方法(文末附多种车辆轨迹数据集)...
- 继 remote stacktrace: Backtrace 报错
- gcc、cc与make
- POJ 3007 - Organize Your Train part II
- Vmware 虚拟机的三种网络模式
- socket编程二十二:socket编程实现文件传输功能
- Python+Appium+夜神模拟器环境搭建,启动模拟器自带的浏览器,相关步骤和遇到问题