Java基础中的这几个细节你知道几个?

简介: 既然5默认是一个整型,而i也是一个整型,那究竟是为什么只有上面的代码报错而下面的代码却没有报错呢?原因其实是:java编译器在编译时能够读取一个常量的值,而却不能读取一个变量的值。

image.png


1 数据类型转换相关细节:


  1. 凡是byte short char类型的数据在运算过程中都会自动转化成int类型的数据进行运算。 如:byte a = 1; byte b = 2; byte c = a+b; 会报错 如:System.out.println('a'+1);输出结果为98
  2. 两个不同数据类型的数据运算时,结果的数据类型取决于大的那个数据的类型。 如:int a = 1; long b = 2L; int sum = a + b;也会报错。 如:System.out.println('a'+1);输出结果为98
  3. byte b = 3;b += 2; 此处 b += 2; 等于 b = b + 2;但是在此处却不会报错,因为该复合运算底层有一个强制类型转换(b++;也不会报错的原因也是底层有一个强制类型转换)


2 一个整数在默认情况下为整型,但看到下面几句代码,是否会有一些疑问呢?


int i = 5; byte b = i;编译时会出现报错的情况,


但 byte b = 5; 编译时却没有问题。


既然5默认是一个整型,而i也是一个整型,那究竟是为什么只有上面的代码报错而下面的代码却没有报错呢?原因其实是:java编译器在编译时能够读取一个常量的值,而却不能读取一个变量的值。在byte b = 5;这里5是一个常量,编译器能够读取到其值,检测到其值能够被byte类型存下是则能通过编译,而byte b = i;时此时i是一个变量,编译器只能检测到它是一个int类型的值而不会知道值具体是多少(在这我们还应知道变量在编译时其实是不会开辟内存空间的,只有在java虚拟机运行到该语句时才会开辟内存空间存储那个值),就会在编译时报错显示精度可能会丢失。


3 算术运算符中要注意的例子:


int i = 0;i = i++; System.out.println(i);输出结果为0。


要知道此题答案需要知道jvm虚拟机的后自增原理。i++;这一句在jvm虚拟机中会先创建一个临时变量,int temp = i; 然后再i = i +1;最后如果有赋值语句时再把temp给出去这里则是 i = temp; 虽然这波操作看起来有点奇怪,但是其实这才符合算术运算符的优先顺序,而以往刚开始学习说的先使用后++反而有点问题,因为++的优先级是高于=的,如果按大多数的地方理解后++就是先使用后++的话 这里就不太符合优先级了。


同理,后置--也会有同样的现象。    


4 复合赋值运算符需注意:


byte b = 1; b = b+1;则会报错 而 byte b = 1; b += 1;则是不会报错的,因为java编译器会自动强制类型转换


其他复合赋值运算符也有相同现象。


5 复合赋值运算符需注意:


byte b = 1; b = b+1;则会报错 而 byte b = 1; b += 1;则是不会报错的,因为java编译器会自动强制类型转换


其他复合赋值运算符也有相同现象。

目录
相关文章
|
2月前
|
存储 Java 编译器
java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
126 0
|
5月前
|
供应链 JavaScript 安全
SBOM概念和Java生成方式
SBOM概念和Java生成方式
|
28天前
|
Java
Java基础—笔记—接口篇
接口是Java中的一个抽象概念,用于创建数据结构,类似于更纯粹的抽象类。定义包括常量(默认public static final)和抽象方法(默认public abstract)。接口通过子类实现,如`public class 子类 implements 接口1, 接口2...`。JDK8后增加了默认方法(通过子类对象调用)和静态方法(通过接口名调用)。JDK9引入了私有方法,仅在接口默认方法中调用。目的是在不修改子类的情况下扩展功能。一个类可以继承一个父类并实现多个接口,一个接口可继承多个接口。
12 0
|
9月前
|
Java Spring 容器
day29_java_基础巩固框架
自己所掌握的基础知识加以巩固和记录!希望大家点赞收藏并能给予鼓励和支持!有任何建议或者帮助也可以来哦!!!
|
9月前
|
XML 设计模式 前端开发
day32_java_基础巩固框架
自己所掌握的基础知识加以巩固和记录!希望大家点赞收藏并能给予鼓励和支持!有任何建议或者帮助也可以来哦!!!虽然有些干货知识很通俗,但也是自己的必经之路i
|
10月前
|
Java 编译器
Java程序的方法设计
Java程序的方法设计
56 0
|
12月前
|
Java 编译器
Java中最基础的概念(了解一下
Java中最基础的概念(了解一下
|
Java C语言
Java基础篇(简单语法的一些细节介绍)
Java基础篇(简单语法的一些细节介绍)
58 0
Java基础篇(简单语法的一些细节介绍)
|
存储 Java
Java基础学习——方法
赋值调用的好处是当程序复杂时,若想调用某个方法的结果,就可以直接用一个变量来代替,便于代码的编写。同样,在将方法的结果赋值给变量后,不打印输出该变量,控制台输出也为空
97 0
Java基础学习——方法
|
Java 程序员
java 方法细节
1.返回多个参数值方案 返回多个参数值,使用数组即可 示例:返回两个数的和和差
51 0