一.数据类型
JAVA中数据类型主要分为两类:基本数据类型和引用数据类型
1.基本数据类型
基本数据类型包括四类八种
四类为:整型、浮点型、字符型以及布尔型
八种:字节型,短整型,整形,长整型,单精度浮点型,双精度浮点型,字符型,布尔型
1.四类八种
1.整型类包扩字节型,短整型,整型,长整型
字节型:byte 类型,占用一个字节内存 数值范围为 -128-127
短整型:short 类型,占用2个字节内存 数值范围为:-32768-32767
整形: int 类型,占用4个字节内存 数值范围为:-2^31 - (2 ^31-1)
长整型:long 类型,占用8个字节内存 数值范围为:-2^ 63 - (2^63-1)
整形类型默认是int类型,并且是带有符号的
2.浮点型包括单精度浮点型,双精度浮点型
单精度浮点型:float 类型 占用4个字节内存 数值范围为:-2^31 - (2 ^31-1)
双精度浮点型:double 类型 占用8个字节内存 数值范围为 -2^ 63 - (2^63-1)
需要注意的是,浮点型默认为double类型,并且是带有符号的,在使用float类型时,需要做出区别说明
3.字符型
char 类型:占用2个字节内存
需要注意的是,char类型是Unicode字符集,包括了字符,中文,英文,等一些其他语言的文字,因此在JAVA中,char类型的取值范围是无法直接计算出结果的
4.布尔类型
布尔类型占用内存无明确规定,取值只有true或者false
在idea上,可以通过输出每种类型的取值范围大小
通过包装类点引用出MAX_VALUE以及MIN_VALUE
例如:
//int的包装类为 Interger System.out.println(Integer.MAX_VALUE); System.out.println(Integer.MIN_VALUE); //long的包装类为 Long System.out.println(Long.MAX_VALUE); System.out.println(Long.MIN_VALUE); //double的包装类为 Double System.out.println(Double.MAX_VALUE); System.out.println(Double.MIN_VALUE); //float的包装类为 Float System.out.println(Float.MAX_VALUE); System.out.println(Float.MIN_VALUE); //short的包装类为 Short System.out.println(Short.MAX_VALUE); System.out.println(Short.MIN_VALUE); //byte的包装类为 Byte System.out.println(Byte.MAX_VALUE); System.out.println(Byte.MIN_VALUE);
由于char类型无法直接计算出取值范围大小,但是char类型的包装类同int类型和其他类型都不是类型名首字母大写开头,char类型的包装名为Character
2.引用数据类型
引用数据类型分为三种:类,接口,数组,在本篇幅中对引用数据类型不做介绍
二.变量
我们以及知道了基本的数据类型,那我们该怎么去使用呢?
而数据类型就是用来定义不同种类变量的,最简单的使用就是创建一个某一种类型的变量,那么这里有一个概念,什么叫变量?
顾名思义,变量就是一个在程序中可以改变的变量
1.变量的定义和语法格式
定义变量的语法格式为: 类型名 + 变量名 = 初始值;
在JAVA当中,我们可以尝试创建一些变量,并理解变量例如
public class Test1_0731 { public static void main(String[] args) { int a = 10; char b = 'b'; double c = 5; float d = 1.5f; byte e = 10; System.out.println("为改变前 " + a); a = 20; System.out.println("改变后 " + a); } }
运行结果如下:
从上可以看出,a b c d e 都是我们创建的不同类型的变量,并且通过a赋值的改变可以印证变量是程序中可以改变的量
在变量的创建和使用中需要注意的是:
由于byte的取值范围为-127-128之间,因此编译器会直接报错并推荐使用一个更大且合理的类型
2.定义的变量在使用前一定要初始化
由于浮点型数据在创建是默认为double类型,因此定义的float类型存储不下double类型,编译器会自动报错无法使用
正确的定义如下:
2.字符类型
计算机中的字符本质上是一个整数. 在 C 语言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符. 因此一个字符占用两个字节, 表示的字符种类更多, 包括中文
需要注意的是,一个中文占两个字节,因此,一个char类型只能存放一个中文,并且char类型的包装类为Character
3.布尔类型(Boolean)
boolean a=true; System.out.println(a); boolean b=false; System.out.println(b);
运行结果如下
需要注意的是
1.boolean 类型的变量只有两种取值, true 表示真, false 表示假
2. Java 的 boolean 类型不存在 1 表示 true, 0 表示 false 这样的用法
3.并且boolean类型无法和其他类型进行转换(详细见如下类型转换)
三.类型转换
1.隐式类型转换(自动类型转换)
当数据类型小的赋值给数据类型大的时候,编译器会自动进行转换
2.强制类型转换
当数据类型大的赋值给数据类型小的时候,不能够自动完成
若想要让b赋值给a,则需要进行处理,即强制类型转换
需要注意的是:
1.强转会存在一定的风险,比如数据的丢失
运行结果如下:
2.强转以后的溢出
short a = 128; byte b = (byte) a; System.out.println(a); System.out.println(b);
那么打印的 a,b分别为多少呢?
short a 显然是128,哪byte b呢?由于b是byte类型,只能存放一个字节的内容也就是八个比特位,而a=128 的补码是 0000 0000 1000 0000,讲a强转为byte类型以后放到b中只能截取前面八位存放,也就是 1000 0000 ,而这个补码对应在byte类型中是-128(此处原、反、补的讲解参考前面文章)
四.类型提升
很多人在这,会和类型转换中的隐式类型转换会混淆
需要区别的是:
隐式类型转换是在赋值时,数据类型小的转为数据类型大的
而类型提升是不同的数据类型在互相运算时,数据类型小的会被提升为数据类型大的
观察下面一段代码:
int a = 100; long b = 10; b = a; // a数据类型小,赋值给b时,编译器自动将a转换为long类型 //err 会报错 //int c = a + b; //a是int类型,而b是long类型, // 它两相加时,a会被先提升为long类型, //最后a+b的结果也为long类型,在int类型中存不下 //将a+b的结果放入a和b中类型大的b的long下可以编译通过 long d = a + b;
错误代码如下:
对于类型提升,需要注意到,如果进行相关运算时,数据大小不够四个字节的类型,会自动默认提升为int类型在进行计算,若有一个变量超过int类型,则进行相关运算时,以向较大的类型转换
例如:
byte a = 20; byte b = 10; byte c = a + b; //编译器会报错
可以看到byte类型的a+b 在编译时不足四个字节大小,在编译前就被提升为了int类型,存放在byte c 中无法存下,建议存放在int类型中