【一道经典的Java面试题】

short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

答案是:前者错,后者对。相信不管是否经历过java面试过,大家一定对这道题很熟悉。因为这道题确实太经典了,以至于成为了基本每个老师都会拿出来,当作课堂例题来讲。要说清这道题,首先看看java表达式类型转换规则。

【java表达式类型转换】

java是一门强类型语言,不仅每个变量具有指定的数据类型,它的表达式也有指定的数据类型。因此在不同类型之间进行赋值操作很容易遇到到类型转换的问题。

在JAVA表达式中,如果进行运算的几个变量类型不一致,JAVA表达式会采取类型自动提升的操作。Java定义如下的自动提升规则:

1. 所有byte型、short型和char型将被提升到int型。
2. 整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。操作数的等级排列如下图所示,位于箭头右边类型的等级高于位于箭头左边类型的等级。以下是java表达式中类型提升等级。

【复合赋值运算符包含的隐式类型转换】

short s1 = 1; s1 = s1 + 1会引起编译错误,s1+1表达式类型会自动提升为int类型,而s1的声明类型为short类型,所以将一个int类型的值赋给short类型将引起编译错误。

但short s1 = 1; s1 += 1;不会出错,因为表达式中使用了+=复合赋值运算符,复合赋值运算符包含了一个隐式的类型转换。s1 = s1 + 1和s1 += 1实际上并不等价。s1+=1实际上等于s1 = (s1的类型)s1+1,复合赋值运算符会自动将他计算的结果值强制类型转换为其左边变量的类型。

转载于:https://blog.51cto.com/745761505/1536598

java表达式类型自动提升相关推荐

  1. java返回类型自动_java-Apache Flink:由于类型擦除,无法自动确定函数的返回类型...

    我在Java中用Flink编写了一个简单的程序,它以文件或文本作为输入,然后使用flatMap函数打印所有单词. 这是我的代码: final ParameterTool params = Parame ...

  2. Java基础:自动装箱和自动拆箱

    Java的自动包装类型 首先基本数据类型:4类8种 基本数据类型 对应包装器类 byte(1字节) Byte short(2字节) Short int(4字节) Integer long(8字节) L ...

  3. java类型提升_java表达式中类型的自动提升(转)

    java表达式中类型的自动提升(转)[@more@]除了赋值,还有另外一种类型变换:在表达式中.想要知道原因,往下看.在表达式中,对中间值的精确要求有时超过任何一个操作数的范围.例如,考虑下面的表达式 ...

  4. java 自动类型_java类型自动转换

    package com.kevin.basic; /* * java类型自动转换方面的知识点 * int类型 double类型 默认类型 */ public class Test { /** * @p ...

  5. Java 基本类型与自动装箱、拆箱

    基本数据类型 基本类型,或者叫内置类型,是 Jav 中不同于类(class)的特殊类型.它们是我们编程中使用最频繁的类型. Java 是一种强类型语言,第一次申明必须说明数据类型,第一次变量赋值称为变 ...

  6. java学习二 数据类型自动提升 0x开头的数据是 16进制且是int型

    变量只能定义一次,不能定义两次, 变量的作用域:当前的大括号与子括号才有效 变量的作用:存储值,取值 整型:向上自动升级,向下强制降级 char,byte,shot参与运算时候自动提升为int型 因为 ...

  7. java整数类型int字面值_JavaKotlinAndroidGuide

    Java是一种强类型化的语言,每个变量都有一种类型,每个表达式也都有一种类型,并且每一种类型都是严格定义的.所有的赋值操作不管是显式的还是在方法中调用中通过参数传递的,都要经过类型兼容性检查 一.基本 ...

  8. java基本类型的面试,15、基本类型常见面试题

    1.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 +=1;有什么错? 答:对于short s1=1;s1=s1+1来说,在s1+1运算时会自动提升表 ...

  9. java语句类型_01-java数据类型与语句

    一.编程基础 数据类型和运算符 1.注释:Java 中有三种注释 单行注释(//). 多行注释(/**/). 文档注释 2.标识符:用于变量.类.方法命名 类名的标识符每个单词的首字母都要大写, 方法 ...

最新文章

  1. 2022-2028年中国超高清视频产业投资分析及前景预测报告
  2. 最全面的卷积神经网络介绍,都在这里了(附代码)
  3. 武汉锅检所检测机器人_嵊州市管道cctv机器人-检测服务,武汉天仪ty333,诚信承诺...
  4. 比尔盖茨,马斯克、霍金都告诉你:为什么要警惕人工智能(中)
  5. 2、Flutter Widget(IOS Style) - CupertinoActionSheet;
  6. Vim试水之六:NerdTree插件安装
  7. linux swap交换分区说明/管理
  8. oracle v$ 表,【学习笔记】Oralce视图 查找分析V$PARAMETER视图的基表
  9. 第五章 染料结构对染色性能的影响单元测验
  10. [Leetcode][程序员面试金典][面试题08.03][JAVA][魔术索引][递归][优化]
  11. C#用注册表开机自动启动某某软件
  12. ImportError: cannot import name '_ellipsoid'
  13. @Autowired @Qualifier
  14. Django python session配置和用法
  15. 计算机/程序员常用英语(持续添加,包括一些简写)
  16. 当前GitHub上排名前十的热门Vue项目
  17. mysql的skip-slave-start参数
  18. 软件项目中的成本构成及估算方法【转】
  19. openSUSE 11.2 上试动Mono
  20. Python的IDLE无法打开

热门文章

  1. (0055)iOS开发之dealloc认识
  2. nginx 一个请求发给多台机器_Nginx系列二:负载均衡与反向代理
  3. ecshop 搜索热词推荐_多多搜索自定义关键词推广的基础点:如何选对致命的关键词...
  4. linux mysql 统一字符编码
  5. Windows下安装Python扩展模块提示“Unable to find vcvarsall.bat”的问题(转载)
  6. 主要的窗体控件的概述
  7. hdu 2295 Radar(二分+DLX)
  8. 谈谈@@IDENTITY 和 SCOPE_IDENTITY()的区别
  9. Spring+SpringMVC+Log4J
  10. html网页特殊符号代码