课时10:Java数据类型划分(整型类型)

简介: 本文主要围绕Java中整型数据展开,详细讲解整型变量、常量的概念,整型数据运算规则,包括数据溢出问题及解决方法,数据类型转换(自动转换与强制转换)的原理和注意事项,同时介绍了整型数据默认值的相关知识,以及byte数据类型与int数据类型的关系和使用场景,帮助读者全面掌握Java整型数据的相关内容。

课时10:Java数据类型划分(整型类型)

摘要:本文主要围绕Java中整型数据展开,详细讲解整型变量、常量的概念,整型数据运算规则,包括数据溢出问题及解决方法,数据类型转换(自动转换与强制转换)的原理和注意事项,同时介绍了整型数据默认值的相关知识,以及byte数据类型与int数据类型的关系和使用场景,帮助读者全面掌握Java整型数据的相关内容。

1. 整形常量与变量

2. 整形数据溢出问题

3. 解决数据溢出的方案

4. 数据类型的转换

5. 整型数据的默认值问题

6. byte数据类型与int数据类型的关系

 

01、 整型变量与常量


在Java程序中,任何整数常量的类型都是int型。例如,定义一个整型变量的代码可以这样写:在新建的`test demo.java`程序中,编写`int num=10`。这里的`10`是一个整数常量,它的值不会改变。程序中,任何整数常量的类型都是int型,将一个整数常量赋值给int型变量是合理的。


如果执行`num*2`,由于`num`是int型变量,`2`是int型常量,按照Java的运算规则,`int`类型数据相乘,结果依然是`int`型。执行代码后可以验证结果是否符合预期。

image.png

image.png

 

02、 整型数据的溢出问题

 

在进行整型数据操作时,会存在数据溢出问题。当整型数据达到其最大或最小值后继续进行数学计算,就可能产生错误数据。

关于变量命名的要求:第一个单词的字母小写,而后每个单词的首字母大写:

例如:maxValue;通过代码示例来观察,

定义`int maxValue=Integer.MAX_VALUE`获取最大值,
`int minValue=Integer.MIN_VALUE`获取最小值。
输出这两个值,会得到最大值`2147483647`和最小值`-2147483648`。
在跟上System.out.println(maxValue);
System.out.println(minValue); 
System.out.println(maxValue+1);
System.out.println(minValue-1);

image.png

image.png

当执行`maxValue+1`时,理论上结果应该还是`int`型,但由于`maxValue`已经是最大值,加1后发生数据溢出,编译执行后结果变成了最小值;同样,`minValue-1`的结果变成了最大值。如果继续进行`minValue-2`操作,编译执行后会得到次最大值,这表明数据计算在超出数据类型范围后出现了偏差。当已经超过了数据类型的局限之后数据的计算就会出现偏差。所以一定要在操作前预估数据大小

image.png

 

03、 解决整型数据溢出的方案


既然`int`型存在溢出问题,解决方法是更换更大的数据类型,即`long`型。但直接使用`long`型处理`int`型溢出问题时,也可能存在陷阱。


例如,`longresult=maxValue+1`,由于程序执行顺序是从等号右边到左边,先在一个区域保存`maxValue+1`的计算结果(此时仍按`int`型计算,会产生溢出),再将结果赋值给`long`型变量,所以结果依然会有溢出问题。解决方式:更换更大的数据类型


范例:使用long来解决int的数据溢出问题。

在使用此类方式处理之前请一定要注意一个问题,所有的程序的执行顺序都是由等号的右边到左边,也就是说,如果你现在使用了 int 进行计算,那么计算结果依然会有溢出,所以最简化的做法是将其中的一个变量,首先做内容的扩充而扩充有两种实现方式。


1)先将`int`变量的内容赋值给`long`变量,再进行计算。如先将`maxValue`赋值给一个`long`型变量,然后再对该变量进行加1操作。

image.png

2)直接将某一个`int`型变量变为`long`型。例如,在`maxValue+1`前加上`long`,表示先将`int`型的`maxValue`变为`long`型,再加上`int`型常量`1`,结果就是`long`类型

image.png

通过这两种方式处理后,编译执行代码,就可以得到正常的计算结果。

 

04、 数据类型的转换


任何数据的整型都是int,但是该数据已经超过了int可以保存的数据范围,那么现在就需要将这个数据明确的表示是一个long型的常量。


(1)由大变小的转换

数据范围大的数据类型变为数据范围小的数据类型需要强制转换,但强制转换可能会丢失精度。例如,当一个大于`int`最大范围的数值要赋值给`int`型变量时,需要明确表示该数值是`long`型常量(在数值后加`l`或`L`,建议加大`L`)。

比如system.out.println(11+1l);容易混淆。如果不进行强制转换,直接赋值,编译时会报错“过大的整数”。

image.png

(2)由小变大的转换

在Java中,数据范围小的数据类型可以自动转换为数据范围大的数据类型,这在数学计算中是自动进行的。例如,`long`型和`int`型进行计算时,`int`型会自动转换为`long`型,然后再进行计算。


强制转换时,要设置目标类型。例如,将一个超出`int`范围的`long`型数据强制转换为`int`型,编译执行后,由于数据范围变小,可能会丢失精度,导致结果不符合预期,如得到最小值等情况。范围小的数据类型可以自动变换为范围大的数据类型。数据范围大的数据类型只有强制转换才能转换为范围小的数据类型。


在实际开发中,尽量避免进行这种可能丢失精度的强制转换操作,除非有特殊需求。面试时可能会遇到相关问题,比如60的阶乘一定不是int能装下的,不确定大小就用long类型。

 

05、 整型数据的默认值问题


在Java中,所有数据类型都有默认值。在方法声明中,如果定义了变量int num但未给其默认值,直接使用该变量会报错,提示“可能尚未初始化”。

解决这个问题有两种方案:

1)在使用变量前进行赋值,如`num=10`,然后再输出变量。但这种方式在老版本的JDK中可能会出错。

image.png

2)在定义变量时直接赋值,这是所有JDK通用的做法,也是最保险的方式。例如`int num=10`,这样可以确保程序正常运行。

image.png

而对于各个数据类型的默认值的时候,需要结合到类的情况下才可以观察到。

 

06、 byte数据类型与int数据类型的关系


(1)byte数据类型的范围

`byte`数据类型可以保存的范围是`-128`到`+127`之间。


(2)与int数据类型的转换

当声明一个`byte`变量并赋值为`10`时,虽然`10`是`int`型,但由于其数据量在`byte`范围内,所以编译执行不会报错,也不需要进行强制转换。

如果为`byte`变量赋值的内容大于`byte`的范围,如赋值为`128`,编译时会提示“不兼容类型”,此时需要进行强制转换。强制转换后,值会变为`-128`,这是因为数据溢出。

image.png

image.png

需要注意的是,如果要将`int`值直接赋值给`byte`变量,只能是常量,不能是`int`变量。例如,`intnum=10`(`10`在`byte`范围内),但如果直接将`num`赋值给`byte`变量,编译时会提示从`int`转换可能会损失精度,依然需要加上强制转换操作。在实际开发中,`byte`和`int`一起使用时进行转换操作存在弊病,尽可能避免,`byte`更多用于二进制流或编码转换等场景。

相关文章
|
21天前
|
存储 Java
# 【Java全栈学习笔记-U1-day02】变量+数据类型+运算符
本篇笔记主要围绕Java全栈学习的第二天内容展开,涵盖了变量、数据类型、运算符以及Scanner类的应用。首先介绍了变量的概念与命名规范,以及如何定义和使用变量;接着详细讲解了Java中的基本数据类型,包括整型、浮点型、字符型、布尔型等,并通过实例演示了数据类型的运用。随后,深入探讨了各类运算符(赋值、算术、关系、逻辑)及其优先级,帮助理解表达式的构成。最后,介绍了如何利用Scanner类实现用户输入功能,并通过多个综合示例(如计算圆面积、购物打折、变量交换及银行利息计算)巩固所学知识。完成相关作业将进一步加深对这些基础概念的理解与实践能力。
35 12
|
9天前
|
存储 缓存 Java
理解Java引用数据类型:它们都是对象引用
本文深入探讨了Java中引用数据类型的本质及其相关特性。引用变量存储的是对象的内存地址而非对象本身,类似房子的地址而非房子本身。文章通过实例解析了引用赋值、比较(`==`与`equals()`的区别)以及包装类缓存机制等核心概念。此外,还介绍了Java引用类型的家族,包括类、接口、数组和枚举。理解这些内容有助于开发者避免常见错误,提升对Java内存模型的掌握,为高效编程奠定基础。
36 0
|
9天前
|
Java
java中一个接口A,以及一个实现它的类B,一个A类型的引用对象作为一个方法的参数,这个参数的类型可以是B的类型吗?
本文探讨了面向对象编程中接口与实现类的关系,以及里氏替换原则(LSP)的应用。通过示例代码展示了如何利用多态性将实现类的对象传递给接口类型的参数,满足LSP的要求。LSP确保子类能无缝替换父类或接口,不改变程序行为。接口定义了行为规范,实现类遵循此规范,从而保证了多态性和代码的可维护性。总结来说,接口与实现类的关系天然符合LSP,体现了多态性的核心思想。
20 0
|
1月前
|
Java
课时17:Java运算符(关系运算符)
范例:进行关系判断。如果要进行关系运算的操作可使用:>、<、>=、<=、!=(不等于)、==。所有的关系运算符判断完成的数据返回结果都是布尔类型(boolean)。只要使用关系运算符进行逻辑判断,最终的结果就是布尔型,只有true和false两种结果,而且能和if语句结合使用。
|
1月前
|
存储 Java 编译器
课时11:综合实战:简单Java类
本次分享的主题是综合实战:简单 Java 类。主要分为两个部分: 1.简单 Java 类的含义 2.简单 Java 类的开发
|
1月前
|
Java 程序员 数据处理
课时19:Java运算符(位运算符)
课时19介绍Java中的位运算符,涵盖进制转换、位与、位或及移位操作。重点讲解了二进制与其他进制的转换方法,通过具体范例演示了位与和位或运算的过程,并展示了八进制和十六进制的处理方式。此外,还解释了逻辑运算符(&&、||)与位运算符(&、|)的区别及其应用场景,特别是位运算在加密中的应用。
|
1月前
|
Java
课时18:Java运算符(逻辑运算符)
课时18介绍了Java中的逻辑运算符(与、或、非)。通过范例详细讲解了非操作的使用,展示了如何正确应用逻辑非(!)。接着分别探讨了与操作(& 和 &&)及或操作(| 和 ||),强调了短路运算符(&& 和 ||)在性能和安全性上的优势。课程通过具体代码示例演示了不同逻辑运算符的效果及其应用场景。
|
1月前
|
Oracle Java 关系型数据库
课时37:综合实战:数据表与简单Java类映射转换
今天我分享的是数据表与简单 Java 类映射转换,主要分为以下四部分。 1. 映射关系基础 2. 映射步骤方法 3. 项目对象配置 4. 数据获取与调试
|
29天前
|
存储 Java 编译器
Java泛型类型擦除以及类型擦除带来的问题
本文主要讲解Java中的泛型擦除机制及其引发的问题与解决方法。泛型擦除是指编译期间,Java会将所有泛型信息替换为原始类型,并用限定类型替代类型变量。通过代码示例展示了泛型擦除后原始类型的保留、反射对泛型的破坏以及多态冲突等问题。同时分析了泛型类型不能是基本数据类型、静态方法中无法使用泛型参数等限制,并探讨了解决方案。这些内容对于理解Java泛型的工作原理和避免相关问题具有重要意义。
|
1月前
|
搜索推荐 Java Android开发
课时146:使用JDT开发Java程序
在 Eclipse 之中提供有 JDT环境可以实现java 程序的开发,下面就通过一些功能进行演示。 项目开发流程