1、数据类型的转换
java中要求参与计算的数据,它们的数据类型必须要一致,否则的话将会进行数据类型的转换。
1.1 自动转换
当我们将byte
类型的数据和int
类型的数据进行相加时,结果会是什么类型呢?
public class Add{
/*
计算byte数据和int数据的和
*/
public static void main(String[] args){
//定义int变量
int a=2;
//定义byte变量
byte b=3;
//使用变量c接收a和b的和
//byte c=a+b; 无法使用byte进行接收
int c=a+b;//可以成功接收
//输出
System.out.println(c);
}
}
从上面来看,byte和int的数据相加时,结果为int类型。这里出现了
自动类型转换
,什么意思呢?取值范围小的类型
会在计算时自动提升为取值范围大的类型
,比如在上例中,计算时,byte
类型会自动提升为int
类型,所以本质上就是两个int类型数据的加法运算,所以需要使用int
去进行接收。
再比如说我们将int
类型的数据和double
类型的数据进行相加
public class Add{
/*
计算double数据和int数据的和
*/
public static void main(String[] args){
//定义int变量
int a=2;
//定义double变量
double b=2.3;
//a与b相加赋值给c
//int c=a+b; 无法使用int接收
double c=a+b;//int类型会自动提升为double
//输出c
System.out.println(c);
}
}
转换规则
范围小的类型会自动向范围大的类型转换,比如byte
、short
和char
会自动转换为int
byte、short、char–》int–》long–》float–》double
1.2 强制转换
当我们将double
类型赋给int
类型会发生什么呢?肯定报错啦!但是也并非无法转换,我们可以进行强制类型转换。
-
强制类型转换
:将取值范围大的数据类型转换为范围小的数据类型。public class Add{ /* 计算double数据和int数据的和 */ public static void main(String[] args){ //定义int变量 int a=2; //定义double变量 double b=2.3; //a与b相加赋值给c int c=(int)(a+b);//使用 (要强制转换的类型) 进行强制类型转换 //输出c System.out.println(c); } }
对比
- 自动类型转换是java自动进行的,而强制类型转换需要我们手动进行。
缺点
- 浮点–》整型时,会造成数据精度的丢失
int
–》short
时,需要去掉两个字节,因为int占4个字节,而short占2个字节,强制转换会造成数据丢失。
1.3 ASCII码表
首先我们知道的是,计算机只认识二进制的0和1,那么如何使计算机可以理解我们人类使用的文字呢?这就是编码表的由来。编码表是一张由人类文字和十进制数据一一对应的一张表格。
ASCII码表是一张将所有英文字母、数字和字符都和十进制进行对应的码表。
2、运算符
2.1 算数运算符
算数运算符 | 描述 |
---|---|
+ | 加法运算 |
- | 减法运算 |
* | 乘法运算 |
/ | 除法运算 |
% | 取模 |
++ 、-- | 自增、自减 |
整数使用以上的运算符进行运算,计算结果永远都是整数。
/*
计算类
*/
public class Calculate{
/*
进行整数的除法运算
*/
public static void main(String[] args){
int a=100;
int b=3;
System.out.println(a/b);//计算结果为:33
}
}
-
++
运算变量自己增长1,用法:将
++
放在变量的前面或者后面。
/*
计算类
*/
public class Calculate{
/*
自增运算
*/
public static void main(String[] args){
//++放在变量后面
int a=2;
int b=3;
int c=a+b++;//先进行加法运算,而后再进行自增加1
System.out.println(c);//5
//++放在变量前面
int d=3;
int e=5;
int f=d+(++e);//先进行自增+1,而后再进行加法运算
System.out.println(f);//9
}
}
-
--
运算变量自己减少1,用法:将
--
放在变量的前面或者后面/* 计算类 */ public class Calculate{ /* 自减运算 */ public static void main(String[] args){ //--放在变量后面 int a=2; int b=3; int c=a+b--;//先进行加法运算,再进行自减 System.out.println(c);//5 //++放在变量前面 int d=3; int e=5; int f=d+(--e);//先进行自减,而后再进行加法运算 System.out.println(f);//7 } }
2.2 赋值运算符
赋值运算符 | 描述 |
---|---|
= | 等于 |
+= | 加等于 |
-= | 减等于 |
*= | 乘等于 |
/= | 除等于 |
%= | 取模等 |
/*
计算类
*/
public class Calculate{
/*
赋值运算符
*/
public static void main(String[] args){
//=
int a=1;
int b=a;//将a的值赋给b
System.out.println(b);//1
//+=
a+=1;//等价于:a=a+1
System.out.println(a);//2
//-=
a-=1;//等价于:a=a-1
System.out.println(a);//1
//*=
a*=2;//等价于:a=a*2
System.out.println(a);//2
// /=
a/=2;//等价于:a=a/2
System.out.println(a);//1
//%=
a%=2;//等价于:a=a%2;
System.out.println(a);//1
}
}
2.3 比较运算符
比较运算符 | 描述 |
---|---|
== | 判断是否相等 |
> | 判断是否大于 |
< | 判断是否小于 |
>= | 判断大于等于 |
<= | 判断小于等于 |
!= | 判断不等于 |
/*
计算类
*/
public class Calculate{
/*
比较运算符
*/
public static void main(String[] args){
//==
System.out.println(1==2);//false
//>
System.out.println(1>2);//false
//<
System.out.println(1<2);//true
//>=
System.out.println(1>=2);//false
//<=
System.out.println(1<=2);//true
//!=
System.out.println(1!=2);//true
}
}
2.4 逻辑运算符
逻辑运算符 | 描述 |
---|---|
&& | 逻辑与,只有当两边的结果都为true时,结果才为true(如果左边就是false,那么不会进行右边的运算) |
|| | 逻辑或,两边只要有一个为true,那么结果为true(如果左边为true,那么不会进行右边的运算) |
! | 取反,!true=false,!false=true |
/*
计算类
*/
public class Calculate{
/*
逻辑运算符
*/
public static void main(String[] args){
//&&
System.out.println(1==1 && 2==2);//true
System.out.println(1==2 && 2==2);//false
//||
System.out.println(1==1 || 2==1);//true
System.out.println(1==2 || 2==1);//false
//!
System.out.println(!(1==2));//true
System.out.println(!(2==2));//false
}
}
2.5 三元运算符
三元运算符的格式
数据类型 变量=布尔表达式?结果1:结果2
- 当布尔表达式的值为true时,变量的值为结果1
- 当布尔表达式的值为false时,变量的值为结果2
/*
计算类
*/
public class Calculate{
/*
三元运算符
*/
public static void main(String[] args){
int a=(1==2)?3:5;//1==2的计算结果为false,所以5将被赋给变量a
System.out.println(a);//5
}
}
3、方法入门
-
方法:将功能抽取出来,将实现功能的代码放在一个大括号内,我们可以在其它地方对这个方法进行调用,这样实现了代码的复用,避免代码冗余。
-
格式:
[修饰符] 返回值类型 方法名(参数列表){ //功能代码 }
3.1 方法的定义
public static void method(int a){
System.out.println(a);
}
public
和static
两个关键字都是修饰符void
是返回值类型method
是方法名a
是方法参数
3.2 方法的调用
/*
方法调用
*/
public class Calculate{
public static void main(String[] args){
method(2);//2是实参,会被赋给形参a,而后输出
}
public static void method(int a){
System.out.println(a);
}
}
3.3 注意事项
- 方法必须定义在一个类中
- 方法必须定义在其它方法外
4、扩展
1、+=的问题
/*
+=的问题
定义一个short类型的变量,
对它进行+=运算,然后输出
*/
public class Calculate{
public static void main(String[] args){
//定义一个short变量
short a=1;
//进行+=运算
a+=1;
//输出
System.out.println(a);//2
}
}
从逻辑上来看:好像会报错啊,因为a+=1等价于a=a+1,因为1是
int
类型,那么short
类型的a会进行自动提升,所以应该需要使用int
类型的变量去接受才对,可是我们这里使用的是short
类型的a去接受,那么为什么不报错呢?因为+=
自带强制类型转换。
2、变量和常量的问题
/*
变量和常量的问题
*/
public class Calculate{
public static void main(String[] args){
byte b1=1;
byte b2=2;
byte b3=1+2;
byte b4=b1+b2;
System.out.println(b3);
//System.out.println(b4); 编译失败
}
}
-
b3=1+2
编译成功,因为1和2是固定的数据,编译器在编译时就可以确定它的结果不会超过byte类型的取值范围,故编译成功。 -
b4=b1+b2
编译失败,因为b1和b2是变量,编译器无法在编译时确定它们的结果是否会超过byte类型的取值范围,所以会将他们的结果当作int类型处理
错呢?因为+=
自带强制类型转换。
2、变量和常量的问题
/*
变量和常量的问题
*/
public class Calculate{
public static void main(String[] args){
byte b1=1;
byte b2=2;
byte b3=1+2;
byte b4=b1+b2;
System.out.println(b3);
//System.out.println(b4); 编译失败
}
}