基本数据类型
Java中共有8种基本数据类型,大致分为四大类:
- 布尔型:boolean
- 整数型:byte、short、int、long
- 浮点型:float、double
- 字符型:char
这八种基本数据类型的取值范围如下:
数据类型
数据类型 | 代表含义 | 默认值 | 取值 | 包装类 |
---|---|---|---|---|
boolean | 布尔型 | flase | 0(false) 到 1(true) | Boolean |
byte | 字节型 | (byte) 0 | -128 到 127 | Byte |
char | 字符型 | ‘\u0000’(空) | ‘\u0000’ 到 ‘\uFFFF’ | Character |
short | 短整数型 | (short)0 | -2^15 到 2^15-1 | Short |
int | 整数型 | 0 | -2^31 到 2^31-1 | Integer |
long | 长整数型 | 0L | -2^63 到 2^63-1 | Long |
float | 单浮点型 | 0.0f | 1.4e^-45 到 3.4e^+38 | Float |
double | 双浮点型 | 0.0d | 4.9e^-324 到 1.798e^+308 | Double |
包装类型
从上表中我们看到每种基本数据类型都有相应的包装类,通过包装类我们可以以对象的形式操作某些功能,包装类型总体又以下几点特性:
1、功能丰富
包装类本质上是一个对象,对象就包含有属性和方法,比如 hashCode、getClass 、max、min 等。
2、可定义泛型类型参数
包装类可以定义泛型,而基础类型不行。
比如使用 Integer 定义泛型,代码:
List<Integer> list = new ArrayList<>();
3、序列化
包装类都实现了 Serializable 接口,所以包装类天然支持序列化和反序列化。
4. 类型转换
包装类提供了类型转换的方法,可以很方便的实现类型之间的转换,比如 Integer 类型转换代码:
String age = "18";
int ageInt = Integer.parseInt(age) + 2;
5. 高频区间的数据缓存
此特性为包装类很重要的用途之一,用于高频区间的数据缓存,以 Integer 为例来说,在数值区间为 -128~127 时,会直接复用已有对象,在这区间之外的数字才会在堆上产生。
为什么会产生高频区域数据缓存?我们查看源码就能发现“线索”,源码版本 JDK 8,源码如下:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
由此可见,高频区域的数值会直接使用已有对象,非高频区域的数值会重新 new 一个新的对象。
各包装类高频区域的取值范围:
- Boolean:使用静态 final 定义,就会返回静态值;
- Byte:缓存区 -128~127,全部缓存;
- Short:缓存区 -128~127,部分缓存;
- Character:缓存区 0~127,部分缓存;
- Long:缓存区 -128~127,部分缓存;
- Integer:缓存区 -128~127,部分缓存。
包装类的注意事项
-
int 的默认值是 0,而 Integer 的默认值是 null。
-
推荐所有包装类对象之间的值比较使用 equlas() 方法,因为包装类的非高频区数据会在堆上产生,而高频区又会复用已有对象,这样会导致同样的代码,因为取值的不同,而产生两种截然不同的结果。
-
Float 和 Double 不会有缓存,其他包装类都有缓存。
-
Integer 是唯一一个可以修改缓存范围的包装类,在 VM optons 加入参数:
-XX:AutoBoxCacheMax=666
即修改缓存最大值为 666 ,将 Integer 最大缓存修改为 666 之后,667 不会被缓存,而 -128~666 之间的数都被缓存了。
关键字
Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名和参数。
- 访问修饰符关键字(3个)
关键字 | 意思 | 解释 |
---|---|---|
public | 共有的 | 可跨包,默认选择 |
protected | 受保护的 | 当前包内可用 |
private | 私有的 | 当前类可用 |
- 修饰方法、类、属性和变量(共9个)
关键字 | 意思 | 解释 |
---|---|---|
static | 静态的 | 属性和方法都可以用Static修饰,直接使用类名.属性和方法名。只有内部类可以使用static关键字修饰,调用直接使用类名.内部类类名进行调用。 |
final | 最终的不可被改变的 | 方法和类都可以用final修饰。final修饰的类不能被继续。final修饰的方法不能被子类重写。 |
super | 调用父类的方法 | public void paint( Graphics g){spuer.paint(g);···} |
this | 当前类的父类的对象 | 调用当前类中的方法(表示调用这个方法的对象) |
native | 本地 | 用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的 |
synchronized | 线程,同步 | 表明一段代码需要同步执行 |
transient | 短暂 | 声明不用序列化的成员域 |
volatile | 易失 | 表明两个或者多个变量必须同步地发生变化 ,用于表示可以被多个线程异步修改的成员变量 |
静态块优先于其他方法/类的执行
- 定义类、接口、抽象类和实现接口、继承类的关键字、实例化对象(6个)
关键字 | 意思 | 解释 |
---|---|---|
class | 类 | public class A(){} |
interface | 接口 | 有方法体但是没有实现 |
abstract | 声明抽象 | 表明类或者成员方法具有抽象属性,可以有也可以没有已经实现的方法体 |
implements | 实现 | 表明一个类实现了给定的接口 |
extends | 继承 | 表明一个类型是另一个类型的子类型,这里常见的类型有类和接口 |
new | 创建新对象 | 用来创建新实例对象 |
- 包的关键字
关键字 | 意思 |
---|---|
import | 引入包的关键字 |
package | 定义包的关键字 |
- 数据类型的关键字(12个)
除了文章开篇介绍的8种数据类型的关键字以外,还有以下几种关键字
关键字 | 意思 |
---|---|
void | 无返回值 |
null | 空值 |
true | 真 |
false | 假 |
- 条件循环(共12个)
if | else |
while | for |
switch | case |
default | do |
break | continue |
return | instance |
insatnce是一个二元操作比较符,返回boolean类型数据。
- 错误处理
关键字 | 意思 | 解释 |
---|---|---|
try | 捕获异常 | public class A(){} |
catch | 处理异常 | try 关键字用于包含可能引发异常的语句块。 |
finally | 有没有异常都要执行 | |
throw | 抛出一个异常对象 | throw 语句将 java.lang.Throwable 作为参数。Throwable 在调用栈中向上传播,直到被适当的 catch 块捕获。 |
throws | 声明一个异常可能被抛出 | 把异常交给上级管理,自己不处理异常。 |
- 保留关键字
关键字 | 意思 | 解释 |
---|---|---|
const | 常量,常数 | 用于修改字段或局部变量的声明。它指定字段或局部变量的值是常数,不能被修改。 |
goto | 转到 | 指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。 |
总结以下,Java种一共有51+2个保留字=53个关键字,记住这些关键字有助于我们理解程序,快速开发。