Java一种静态编程语言,所有变量和表达式是在编译时就确定的。同时,Java又是一种强类型语言,所有的变量和表达式都有具体的类型,并且每种类型是严格定义的。类型限制了变量可以hold什么样的值,表达式最终会产生什么样的值,可以进行哪些操作。在Java中共有8中基本类型数据,同时每种基本类型又有对应的包装类。本文将介绍Java中的基本数据类型及其包装类,主要内容如下:
- JAVA的编译运行过程
- 介绍Java中的基本类型及其大小
- 基本类型之间的转换
- 包装类
JAVA的编译运行过程
一个java程序从源文件到运行的整个过程可以分为两个大的阶段:
- 源代码由编译器编译为字节码文件(.class文件)
- 一个类对应一个字节码文件
- 字节码由JVM解释运行。
其中,编译使用 javac 命令,运行使用 java 命令。
- JDK是Java开发工具包 ,包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。
- JRE是运行基于Java语言编写的程序所不可缺少的运行环境。也是通过它,Java的开发者才得以将自己开发的程序发布到用户手中,让用户使用。
- JVM是整个Java实现跨平台的最核心的部分,所有的Java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行
- JDK中包含了JRE,JRE又包含JVM
编译错误和运行错误:
编译期就是将我们写的java源代码交给编译器执行的过程,起翻译的作用,该过程主要对java源代码的语法进行检查,如果没有语法错误,就将源代码编译成字节码文件(即.class文件);
运行期则是将字节码文件(.class文件)加载到内存中交给java虚拟机执行,直到程序执行结束的过程,该过程主要对程序的逻辑错误进行检查,如果没有逻辑错误,程序的功能得到实现,输出结果。
- (1) 编译错误:就是编译器无法进行继续编译的错误,最基本的就是语法错误了,比如语句后面少了;或者 } 不匹配之类的,选择题一般是这样。编译错误可以由编译器检查出来。
编译错误一般指语法错误或者很明显的逻辑错误。
如:缺少分号,少写括号,关键字书写错误等, 在eclipse往往会画红线。 - (2) 运行时错误:分为两类:1. 由于考虑不周或者输入错误导致程序异常,比如数组越界访问,除数为0,堆栈溢出等。2,由于程序设计思路的错误导致程序异常或难以得到预期结果。编译器对运行时错误无能为力,查错和纠错完全由用户自己来完成。
运行错误是在没有编译错误的基础上运行后产生的逻辑错误。
如:空指针异常,除数为0,越界访问等,一般会抛出异常。
基本数据类型
Java共有8种基本数据类型,它们分别如下表所示:
基本数据类型 | 类型 |
---|---|
byte | 数值型 |
short | 数值型 |
int | 数值型 |
long | 数值型 |
double | 数值型 |
float | 数值型 |
char | 字符型 |
boolean | 布尔型 |
占用空间大小
在介绍基本类型时,先将一个概念——字面量值(literal)。所谓字面量值,就是指表面上的值,譬如5、200等值是整型字面量值,如果想要long型字面量值,在整型字面量值后面加上l或者L(推荐L)。整型字面量值可以由多种不同的表达方式,如16进制值(以0X或者0x开头)、10进制、8进制值(以0开头)和2进制值(以0B或者0b开头,JDK1.7以上版本才有)。
byte、short、int、long类型变量都可以赋予整型字面量值,譬如byte a = 10、short b = 0x45都是合法的赋值操作。Java编译器在编译是会检查字面量值所表示的数字大小是否处于变量类型的合法范围内,如果不在,则无法通过编译。如果多种数值类型的数据进行数学运算时,计算结果的类型是其中这些数值中最高等级或者其更高等级类型。
基本类型的占用空间大小
- byte(字节)用无符号的8位表示,它的取值范围是[-2^7, 2^7-1]。它是最小的整型类型,通常用于网络传输、文件或者其他I/O数据流。默认值是0。
- short(短整型)用有符号的16位表示,它的取值范围是[-2^15, 2^15-1]。从日常的观察来看,short类型可能是最不常用的类型了。完全可以用int来替代它,因为我们通常不需要过多地担心内存容量问题。默认值是0。
- int(整型)用有符号的32位表示,它的取值范围是[-2^31, 2^31-1],计算机中用存放的是整型数值的二进制补码。默认值是0。
- long(长整型)用有符号的64位表示,它的取值范围是[-2^63, 2^63-1]。它的字面量表示以l或者L结束,如 long a = 45454L。默认值是0L。
- float(单精度浮点型)用32位表示,它的取值范围是(-2^128 ~ +2^128),遵循IEEE 754规范。如果数值精度要求不高时,可以使用这种类型。float类型字面量值通常以f或者F结束。由于整型可以自动转换为float类型,所以,我们也可以将整型字面量值直接赋予float类型变量。默认值是0F。
- double(双精度浮点型)用64位表示,它的取值范围是(-2^1024 ~ +2^1024),遵循IEEE 754规范。它能表示比float更高精度的数值。double是Java基本类型中能达到的最高精度,如果还不能满足要求,可以使用Java中的BigDecimal类。默认值是0.0。
- char(字符)用无符号的16位表示,它的取值范围是[0, 2^16-1]。Java中使用Unicode字符集来表示字符,Unicode将人类语言的所有已知字符映射成16位数字,所以Java中的char是16位的。默认值是\u0000。
注意事项:
- Java 中使用 单引号 + 单个字母 的形式表示字符字面值.
- 计算机中的字符本质上是一个整数. 在 C 语言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符. 因此一个字符占用两个字节, 表示的字符种类更多, 包括中文.使用一个字符表示一个汉字:
- 浮点型可能只是一个近似值,并非精确值。
- 数据范围与字节数不一定相关。例如:float数据范围比long更加广泛,但是float是4字节,long是8字节。
- 浮点数当中默认类型是double。如果一定要使用float类型,需要加上一个后缀F。如果是整数,默认为int类型,如果一定要使用long类型,需要加上一个后缀L。大小写后缀都可以,推荐使用大写字母后缀。例如:System.out.println(100L);
- boolean( 布尔型)只要true和false两个字面量值,可用于逻辑判断。boolean只能表示1位的信息量,但是它的大小并没有精确地定义。
- float:意味着最多能有7位有效数字,也即float的精度为6-7位有效数字;double的精度为15-16位。
char ch = '呵';
System.out.println(ch);
执行 javac 的时候可能出现以下错误:
Test.java:3: 错误: 未结束的字符文字
char ch = '鍛?';
^
此时我们在执行 javac 时加上 -encoding UTF-8 选项即可
javac -encoding UTF-8 Test.java