变量指的是程序运行时可变的量,相当于开辟一块内存空间来保留一些数据,类型则是对变量的种类进行了划分,不同的类型的变量具有不同的特性。
Java中的数据类型可以按照以下方式进行划分。
1.基本数据类型
接下来我们一起学习一下java中的基本数据类型,总的来说java中的基本数据类型学起来要比C语言简单和形象许多,因为java是强类型语言,许多细节我们可以不用考虑。
在这里假设你经营着一家快递公司,市场上只有三种类型的快递,分别是数值型,字符型和布尔类型。针对这三种类型的快递,我们生产了8种类型的箱子来装快递。int,long,short,byte这四种箱子用来装数值型中的整型。float,double用来装数值型中的浮点型。char这种箱子用来装字符型。boolean用来装布尔类型。
1.1整型变量int
//基本语法格式
int 变量名 = 初始值;
//代码示例
int num = 10;//定义一个整型变量
System.out.println(num);
int这种箱子里面装的是整型,变量名是变量的标识,用变量名来给快递命名。在你的快递公司中,一个int型的箱子大小是4个字节。它可以表示的数据范围是**- 2 ^ 31 ~ 2 ^ 31 - 1**,大概是-21亿到+21亿。在这个范围内的整数都可以装进int型的箱子。
//在java中可以使用一下代码查看java中的整型数据范围
System.out.println(Integer.MAX_VALUE);//int的最大值
System.out.println(Integer.MIN_VALUE);//int的最小值
如果运算的结果超出了int的最大范围,就会出现溢出的情况。
1.2长整型变量long
//代码示例:
long num = 10L;//这里建议用大写的L,小写的l容易被看成数字1
System.out.println(num);
long这种箱子的大小是8个字节,它可以表示的数据范围是**- 2 ^ 63 ~ 2 ^ 63 - 1**,在这个范围内的整数都可以装进long型的箱子。
1.3短整型变量short
//代码示例:
short num = 10;
System.out.println(num);
short这种箱子的大小是2个字节,它可以表示的数据范围是**- 2 ^ 15 ~ 2 ^ 15 - 1**,在这个范围内的整数都可以装进short型的箱子。
1.4字节类型变量byte
//代码示例:
byte num = 10;
System.out.println(num);
byte这种箱子的大小是1个字节,它可以表示的数据范围是**- 2 ^ 7 ~ 2 ^ 7 - 1**,在这个范围内的整数都可以装进byte型的箱子。
1.5单精度浮点型
//代码示例:
float num = 1.0F;
System.out.println(num);
float型的箱子大小为4个字节,但是它的内部结构与整型箱子不同。它的内部具体分为3部分,它用来装浮点型的快递,快递会按特定的方式装进去,比整型的要复杂许多。
1.6双精度浮点型
//代码示例:
double num = 1.0;
System.out.println(num);
double类型的箱子大小为8个字节,它的内部结构与float相似,也分为3个部分,用它来装的浮点型数据范围要比float能装的大出许多许多。
1.7字符型变量
char ch = 'A';
System.out.println(ch);
char类型的箱子大小为2个字节,它可以装字符型的数据。而在java中用Unicode表示字符,一个字符占两个字节。只要是能用Unicode表示的字符都可以装进这个箱子。比如中文,日文等都可以。
1.8布尔类型变量
boolean value = true;
System.out.println(value);
boolean型的箱子用于装布尔类型的数据,直能装true或者false。箱子的大小没有特别明确的规定,有的快递公司是一个字节,有的是一个比特位。
2.字符串类型变量String
//语法格式
String 变量名 = "初始值";
//代码示例
String name = "zhangsan";
System.out.println(name);//打印字符串
String不是基本类型而是引用类型,在String中有一些不太方便直接表示的字符,就需要用转义字符来进行转义。
转义字符有很多,比较常见的有以下几个:
字符串的“+”操作,表示字符串的拼接。
String a = "hello";
String b = "world";
String c = a + b;
System.out.println(c);
//打印结果为helloworld
还可以将字符串和整数进行拼接:
String str = "result = ";
int a = 10;
int b = 20;
String result = str + a +b;
System.out.println(result);
//执行结果
result = 1020;
上面代码说明,当一个**+**表达式中存在字符串的时候,进行的都是拼接行为。
3.变量的作用域
变量的作用域也就是该变量能生效的范围,一般是变量定义所在的代码块.
4.变量的命名规则
硬性指标:
1.一个变量名只能包含数字,字母,下划线
2.数字不能开头
3.变量名是大小写敏感的,即num和Num是两个不同的变量。
注意:虽然语法上也允许使用中文/美元符$命名变量,但是强烈不建议这样做。
软性指标:
1.变量名要具有可描述性,见名知意
2.变量名不建议使用拼音
3.变量名的词性推荐只用名词
4.变量名推荐使用小驼峰命名法,当一个变量名由多个单词构成时,除了第一个单词,其他单词首字母大写。
小驼峰:int maxValue = 100;
5.常量
5.1字面型常量
5.2 final关键字修饰的常量
final int a = 10;
a = 20;//编译出错,提示无法为最终变量a分配值,程序无法在变量运行过程中发生修改
6.类型转换
java作为一个强类型编程语言,当不同类型之间的变量相互赋值的时候,会有较严格的校验
7.数值提升
int 和long类型的混合运算
int a = 10;
long b = 20;
int c = a + b;//编译出错,提示将long转成int会丢失精度
long d = a + b;//编译通过
结论:当int和long混合运算的时候,int会提升成long,得到的结果仍然是long类型,一个long类型的快递,int型的箱子肯定装不下,因此需要一个更大型号的long型的箱子才可以,因此将int型的数据提升为long型的数据来处理,然后再装在int型的箱子里。
byte和byte的运算
byte a = 10;
byte b = 20;
byte c = a + b;
System.out.println(c);
//编译报错
Test.java:5:错误:不兼容的类型:从int转换到byte可能会有损失
byte c = a + b;
结论:byte和byte虽然是相同类型的,但是编译的时候出错,原因是,虽然a和b都是byte,但是计算a+b会将a和b提升成int型,再进行计算,得到的结果也是int,这是赋值给c就会出现上述错误。
这是因为计算机的CPU通常是按照4个字节为单位从内存中读写数据。为了硬件上实现方便,诸如byte和short这种处于4个字节的类型会先提升成为int,再参与计算:
用byte类型的箱子装a和b,然后将他们放在int型的箱子里进行处理,最后再装在byte型的箱子里,显然byte是装不下int的!!!
正确的写法:
byte a = 10;
byte b = 20;
byte c = (byte)(a + b);//这里强制转换为byte
就是说,如果不加说明,你的快递公司默认会用int型的箱子来处理快递,这往往会对其他类型的整型数据产生一些不友好的现象。因此需要强制类型转换,换成别的类型的箱子进行处理。
类型小结:
1.不同类型的数据混合运算,范围小的会提升为范围大的
2.对于short,byte这种比4个字节小的类型,会先提升成4个字节的int,再运算。
8.int和String之间的互相转换
int转换为String
int num = 10;
//方法1
String str1 = num +"";
//方法2
String str2 = String.valueof(num);
String转换为int
String str = "100";
int num = Integer.parseInt(str);