这个系列的文章标题都是Java基础,但是并不打算谈一些所有语言共通的东西,比如变量赋值、循环、判断等等。我觉得学习一门语言应该把注意力更多的放在它的特性上,而不是太过关注语言的通性。废话不多说了,从这篇文章开始,正式进入java的学习吧。
基本数据类型和引用数据类型
java中的8种基本数据类型
- 数值型
- 整型:byte、int、short、long
- 浮点型:float、double
- 字符型:char
- 布尔型:boolean
除了上述8种基本数据类型以外,其余的全部都是引用数据类型,数组也是引用类型。这两种类型的数据之间有着本质的区别:基本类型数据指的是值,而引用类型数据指的是地址值。虽然都是值,但二者绝不是同一种东西。
在理解上面的概念之前,我们先要知道java中的两种操作:
- =:赋值操作
- ==:比值操作
对于基本类型数据而言,赋值、比值指的是数值;对于引用类型数据而言,赋值、比值指的是地址值。(请一定要牢记此概念!)
8种基本数据类型在java中都有对应的引用类型,分别是Byte、Integer、Short、Long、Float、Double、Character、Boolean。
下面我们来看一个例子:
public class Test {
public static void main(String[] args) {
int a = 666;
int b = 666;
System.out.println(a == b); // true
Integer c = 666;
Integer d = 666;
System.out.println(c == d); // false
}
}
例子中变量a、b是基本数据类型,经过赋值操作之后变量a、b存放的都是值(666)。而对于比值操作a == b,所表达的含义应该是这样的:666 == 666。所以打印结果为true是合理的。
相对的,变量c、d是引用数据类型。将666赋值给变量c,变量c所存放的是666在内存中地址值(假设该地址值是15db9742),而变量d中所存放的则是另一个666在内存中的地址值(假设这个地址值是15db9747)。所以对于比值操作c == d,它所表达的含义是这样的:15db9742 == 15db9747。显然它们是不相等的,所以输出的打印结果为false。
具体可以参考下图:
数组
8种基本数据类型中并不包含数组,换而言之,数组是一种引用数据类型。所以,一个数组类型变量存放的是地址值。
数组声明
- 一维数组
int[] arr; // 标准的声明格式
int arr[]; // 当然你也可以这样声明
- 二维数组
int arr[][]; // 标准的声明格式
int[] arr[]; // 声明数组对[]的位置没有强制要求,只要[]出现在类型之后即可
数组初始化
数组初始化有两种方式:静态初始化和动态初始化。
- 静态初始化
int[] arr = new int[] {1,2,3};
int[] arr = {1,2,3}; // 简化的静态初始化
- 动态初始化
int[] arr = new int[3];
数组的静态初始化需要提供元素的初始值(0~任意个),动态初始化则需要指定元素的个数(>=0)。需要注意的是,不要将静态初始化和动态初始化混在一起使用。
int[] arr = new int[3]{1,2,3}; // 错误的初始化
使用动态初始化创建数组实例,数组中的每个元素也被赋予了初始值,该初始值是元素数据类型的默认值初始值。不同类型数据的默认初始值见下表:
数据类型 | 默认值 |
---|---|
byte,short,int,long | 0 |
float,double | 0.0 |
char | 一个空字符,即 ‘\u0000’ |
boolean | false |
引用类型 | null |
数组一旦初始化完成,该数组的长度就被固定,无法再进行修改。
二维数组初始化
二维数组的初始化和一维数组略有不同,这个不同主要体现在动态初始化上。我们先来看二维数组是怎么进行静态初始化的:
int[][] arr = {{1,2,3}, {4,5,6}, {7,8,9}};
上面我们声明了一个由3个等长的一维数组所组成的二维数组,这不难理解。接下来我们稍作修改:
int[][] arr = {{1,2,3}, {4,5}, {6}};
上面的二维数组所包含的每个一维数组的长度都不一样。既然如此,那么我们可以试着这样来动态初始化二维数组:
int[][] arr = new int[3][];
上面声明的二维数组是由3个不定长的一维数组所组成的,换而言之,这个二维数组中所包含的是三个尚未创建的一维数组,这样一来,二维数组便有了极大的灵活性。