本文章章主要记录数据类型的转换、运算符的相关操作
文章目录
Java基础-数据类型转换与运算符操作
数据类型转换的前言
Java程序中要求参与的计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换。
数据类型的自动转换【隐式】
当int类型变量和byte类型变量进行加法运算
时,结果会是什么类型?
byte num1 = 1
int num2 = 2;
//byte num3 = num1 + num2; //错误写法
//num1会自动类型提升成int
int num3 = num1 + num2; //正确写法
String text = “隐式自动转换”;
#{text}特点:代码不需要进行特殊处理,自动完成。
#{text}规则:会自动将取值范围小的数据类型
提升为取值范围大的数据类型
,byte
、short
、char
运算时会首先提升成为int类型
,然后再计算
boolean类型不能发生数据类型转换
byte->short->int->long->float->double
这边可能有人会以为long(8字节)为什么会转float(4字节)?(如果这里没人有疑问更好 )
解答:转看 #{text}规则。
附上一张图解
byte 类型
内存占有1个字节,在和int 类型
运算时会提升为int 类型
,自动补充3个字节,因此计算后的结果还是int 类型
。
数据类型的强制转换【显式】
当把浮点数
赋值给int数据类型
时会发生什么问题?
//int num1 = 1.5; //错误写法
int num1 = (int)1.5; //正确写法
double 类型
内存8个字节,int 类型
内存4个字节。 1.5 是double 类型
,取值范围大于 int 。可以理解为 double 是8升的水壶, int 是4升的水壶,不能把大水壶中的水直接放进小水壶去。
想要赋值成功,只有通过强制类型转换
,将double 类型强制转换成 int 类型
才能赋值。
String text = “强制显式手动转换”;
#{text}特点:代码需要进行特殊的格式处理,不能自动完成。
#{text}规则:将取值范围大的类型
强制转换成取值范围小的类型
。
#{text}格式:数据类型 变量名 = (数据类型)被转数据值;
int num1 = (int)1.5; //强制类型转换(浮点数转换整数直接去掉小数)(可能造成精度损失)
//结果:1
byte num2 = (byte)155; //可能造成(数据丢失)
//结果:-101
数据类型强制转换所带来的相关问题
数据类型强制转换有可能发生精度损失
、数据溢出(数据丢失)
。
精度损失口叙:当浮点数转换时有可能会造成小数的损失。(例如:浮点数转整数)
数据溢出口叙:4桶水倒进两个空桶里,可能会溢出水啊。
强转所造成的数据丢失图解
ASCII表
编码表 ASCII(American Standard Code for Information Interchange 美国标准信息交换码)。
0(48) - 9(57)
A(65) - Z(90)
a(97) - z(122)
运算符与表达式概念
运算符:进行特定操作的符号。 例如:+
表达式:用运算符连起来的式子叫做表达式。例如:20 + 5。又例如:a + b
运算符操作
算数运算符(+、-、*、/、%、++、–)
+(加法运算符)
注意事项:
1.对于数值来说,那就是加法。
2.对于char类型来说,char先根据ASCII表提升为int类型,再进行计算。
3.对于String字符串来说,是字符串拼接。
%(取模)(求余数)
规律:如果有余数,那么余数为(0 ~ 除数-1)
++(自增)、–(自减)
++:变量自己增长1。
–:变量自己减少1。
类别分为:前自增(num++)、后自增(++num),–和++一样。
使用的方式分为:
单独使用:不和其他任何操作混合,自己独立成为一个步骤
混合使用:和其他操作混合,例如与赋值混合,或者与打印操作混合,等。
使用的区别:
在单独使用的时候
:前++和后++没有任何区别。也就是:++num;和num++;是完全一样的。
在混合的时候有【重大区别】
:
如果是【前++】,那么变量【立刻马上+1】,然后拿着结果进行使用。 【先加后用】
如果是【后++】,那么首先使用变量本来的数值,【然后再让变量+1】。 【先用后加】
赋值运算符(+=、-=、*=、/=、%=)
int i = 5;
i+=3; //i = i + 3;变量i先加3,再赋值变量i
比较运算符(>、<、>=、<=、!=、==)
比较运算符
:是两个数据之间进行比较的运算,运算结果都是布尔值 true 或者 false。
逻辑运算符(&、&&、|、||、!)
&&:与(并且)
:全都是true,才是true;否则就是false。
||:或(或者)
:至少一个是true,就是true;全都是false,才是false。
!:非(取反)
:本来是true,变成false;本来是false,变成true。
条件A && 条件B(注:可以有多个条件)
逻辑运算符
:是用来连接两个布尔类型结果的运算符,运算结果都是布尔值 true 或者 false。
&与&& 和 |与||的区别
:
& 和 | 左右两边的式子一定会执行(效率慢)
&& 和 || 只要左边的式子能得出结果,右边的式子就不会执行(效率快)
!取反。 例子:!true(结果为false)
三元运算符(相当于if…else)
一元运算符
:只需要一个数据就可以进行操作的运算符。例如:取反!、自增++、自减–。
二元运算符
:需要两个数据才可以进行操作的运算符。例如:加法+、赋值=。
三元运算符格式
:数据类型 变量名 = 布尔类型表达式?表达式A:表达式B
三元运算符格式口述
:首先先判断布尔类型表达式是否成立,成立(true)将表达式A的值赋值给左侧的变量,不成立(false)将表达式B的值赋值给左侧的变量。
注意事项:必须同时保证表达式A和表达式B都符合左侧数据类型的要求。
方法定义的格式与作用
方法
:就是将一个功能抽取出来,把代码单独定义在一个大括号内,形成一个单独的功能。
好处
:当我们需要这个功能的时候,就可以去调用。这样即实现了代码的复用性,也解决了代码冗余的现象。
定义格式
:
访问修饰符 [静态修饰符] 返回值类型 方法名(数据类型 变量名[参数列表]){
方法体 //可以包含任意条语句
return 返回类型;
}
注意:如果返回类型为void,那么方法体中不能写return关键字。
编译器的常量优化
在给变量进行赋值的时候,如果右侧的表达式当中全都是常量,没有任何变量,那么编译器javac将会直接将若干个常量表达式计算得到结果。
例如:int num1 = 1 + 1;
这称为 “编译器的常量优化”。
注意:一旦表达式当中有变量参与,那么就不能进行这种优化了。