Java 数据类型与变量
一、字面常量:程序中的不变量
在 Java 程序中,有些值是固定不变的,我们称之为常量。例如在 HelloWorld 程序中,"Hello World" 就是一个常量,无论程序何时运行,它的输出都不会改变。常量的存在为程序提供了稳定的参考点,就像现实生活中 "一个礼拜七天" 这样的固定事实。
1.1 字面常量的分类
Java 中的字面常量主要分为六类:
- 字符串常量:由双引号括起来的内容,如 "12345"、"hello",甚至是 "你好" 这样的中文内容。
- 整型常量:程序中直接书写的数字,不带小数点,如 100、1000。
- 浮点数常量:带有小数点的数字,如 3.14、0.49。
- 字符常量:由单引号括起来的单个字符,如 'A'、'1'。
- 布尔常量:只有两个值,true 表示真,false 表示假。
- 空常量:null,用于表示不存在的引用,我们将在后续内容中详细讲解。
这些常量分别对应 Java 中的不同数据类型,共同构成了程序的数据基础。
二、数据类型:Java 的类型体系
Java 是一种强类型语言,这意味着每个变量都必须有明确的数据类型。Java 的数据类型主要分为两大类:基本数据类型和引用数据类型。
2.1 基本数据类型:Java 的内置类型
基本数据类型是 Java 中最基础的数据类型,共有四类八种:
数据类型 | 关键字 | 内存占用 | 范围 | |
---|---|---|---|---|
字节型 | byte | 1 字节 | -128 ~ 127 | |
短整型 | short | 2 字节 | -32768 ~ 32767 | |
整型 | int | 4 字节 | -2^31 ~ 2^31-1 | |
长整型 | long | 8 字节 | -2^63 ~ 2^63-1 | |
单精度浮点数 | float | 4 字节 | 有范围,一般不关注 | |
双精度浮点数 | double | 8 字节 | 有范围,一般不关注 | |
字符型 | char | 2 字节 | 0 ~ 65535 | |
布尔型 | boolean | 没有明确规定 | true 和 false |
2.1.1 整型家族
整型家族包括 byte、short、int 和 long 四种类型,它们的主要区别在于内存占用和表示范围:
- int:是最常用的整型,在任何系统中都占用 4 个字节,范围为 - 2^31 到 2^31-1,足够满足大多数编程需求。
- long:占用 8 个字节,范围远大于 int,适用于需要表示极大或极小整数的场景。为了与 int 区分,long 类型的初始值通常添加后缀 L,如 100L。
- short:占用 2 个字节,范围较小,在实际开发中使用较少。
- byte:仅占用 1 个字节,范围是 - 128 到 127,常用于存储二进制数据或节省内存。
为什么需要这么多不同的整型呢?这就好比买衣服时需要不同的尺码,不同的整型类型可以根据数据的大小选择合适的 "容器",既节省内存又保证精度。
2.1.2 浮点型家族
浮点型用于表示带有小数的数字,包括 float 和 double 两种:
- double:占用 8 个字节,是 Java 中默认的浮点类型,精度较高,适用于大多数浮点计算。
- float:占用 4 个字节,精度较低,使用时需要添加后缀 F 或 f,如 3.14F。由于精度限制,工程上通常优先使用 double。
需要注意的是,浮点数在内存中的存储方式与整数不同,因此会存在精度误差。例如,1.1 乘以 1.1 的结果并不是精确的 1.21,而是 1.2100000000000002。这是因为浮点数采用 IEEE 754 标准存储,无法精确表示所有小数。
2.1.3 字符型与布尔型
- char:占用 2 个字节,用于表示单个字符。与 C 语言使用 ASCII 码不同,Java 使用 Unicode 编码,因此可以表示包括中文在内的各种字符。例如,char c = ' 帅 ' 是合法的赋值。
- boolean:用于表示真假,只有 true 和 false 两个值。需要注意的是,Java 的 boolean 类型不能与 int 类型相互转换,不存在 1 表示 true、0 表示 false 的用法。
2.2 引用数据类型:复杂数据的表示
除了基本数据类型,Java 还提供了引用数据类型,如 String 类用于表示字符串。引用数据类型的变量存储的是对象的引用,而不是数据本身,这使得它们可以表示更复杂的数据结构。我们将在后续章节中详细探讨引用数据类型。
三、变量:程序中的可变数据
在程序中,除了固定不变的常量,更多的数据是会发生变化的,例如人的年龄、成绩分数等。这些在程序中可以变化的数据,我们称之为变量。
3.1 变量的定义与使用
定义变量的语法格式为:数据类型 变量名 = 初始值;
。例如:
java
int a = 10; // 定义整型变量a并初始化为10
double d = 3.14; // 定义双精度浮点型变量d并初始化为3.14
char c = 'A'; // 定义字符型变量c并初始化为'A'
boolean b = true; // 定义布尔型变量b并初始化为true
变量定义后可以修改其值,例如:
java
int a = 10;
System.out.println(a); // 输出10
a = 100; // 修改变量a的值为100
System.out.println(a); // 输出100
3.2 变量的初始化
变量在使用前必须初始化,有两种初始化方式:
-
定义时初始化:在定义变量的同时赋予初始值,这是推荐的方式。
java
int a = 10; // 推荐
-
定义后初始化:先定义变量,再在使用前赋予初始值。
java
int b; b = 10; // 使用前必须赋值
如果定义变量后没有初始化就使用,编译器会报错。
3.3 变量的作用域
变量的作用域是指变量在程序中可以被访问的范围。在 Java 中,变量的作用域由花括号 {} 决定。例如:
java
public static void main(String[] args) {int a = 10; // 变量a的作用域是整个main方法{int b = 20; // 变量b的作用域是这个花括号内}System.out.println(a); // 正确,a在作用域内System.out.println(b); // 错误,b超出作用域
}
四、类型转换:数据的变形记
在 Java 编程中,经常需要在不同数据类型之间进行转换。Java 的类型转换主要分为自动类型转换和强制类型转换两类。
4.1 自动类型转换:小范围到大范围的自然过渡
自动类型转换发生在数据范围小的类型转换为数据范围大的类型时,编译器会自动处理。例如:
java
int a = 10;
long b = a; // int自动转换为long
double d = 3.14F; // float自动转换为double
自动类型转换的规则是:范围小的类型可以隐式转换为范围大的类型。需要注意的是,byte、short 等小于 4 字节的类型在运算时会先提升为 int 类型,再进行计算。
4.2 强制类型转换:大范围到小范围的人工干预
当需要将数据范围大的类型转换为范围小的类型时,需要使用强制类型转换,语法为:(目标类型) 变量名
。例如:
java
long b = 100L;
int a = (int)b; // long强制转换为int
double d = 3.14;
float f = (float)d; // double强制转换为float
强制类型转换可能会导致精度丢失或数据溢出,使用时需要谨慎。例如:
java
int a = 128;
byte b = (byte)a; // 128超出byte范围,结果为-128
4.3 类型提升:运算中的类型转换
当不同类型的数据进行运算时,会发生类型提升,小范围的类型会提升为大范围的类型:
java
int a = 10;
long b = 20;
long c = a + b; // a提升为long后再运算
特别要注意的是,两个 byte 类型的变量相加时,会先提升为 int 类型再运算,因此结果可能超出 byte 范围:
java
byte a = 10;
byte b = 20;
byte c = (byte)(a + b); // 需要强制转换
五、字符串类型:文本数据的处理
在 Java 中,字符串是一种常用的数据类型,使用 String 类表示。字符串可以通过 + 号进行拼接:
java
String s1 = "hello";
String s2 = " world";
System.out.println(s1 + s2); // 输出"hello world"
5.1 字符串与数字的转换
在实际开发中,经常需要在字符串和数字之间进行转换:
-
int 转 String:
java
int num = 10; String str1 = num + ""; // 方法1:与空字符串拼接 String str2 = String.valueOf(num); // 方法2:使用String的valueOf方法
-
String 转 int:
java
String str = "100"; int num = Integer.parseInt(str); // 使用Integer的parseInt方法
六、实践建议:写出规范的代码
-
变量命名:遵循驼峰命名法,类名使用大驼峰(如 StudentInfo),变量和方法名使用小驼峰(如 studentName)。
-
类型选择:
- 整型默认使用 int,长整型使用 long 并添加后缀 L。
- 浮点型默认使用 double,单精度使用 float 并添加后缀 F。
- 字符型使用 char,字符串使用 String。
-
类型转换注意事项:
- 自动类型转换时注意数据范围,避免溢出。
- 强制类型转换时明确可能的精度损失,并添加注释说明。
-
变量初始化:尽量在定义变量时初始化,避免忘记赋值导致的错误。