数据类型 | 关键字 | 内存占用 | 取值范围 | 说明 | 默认值 |
---|---|---|---|---|---|
字节型 | byte | 1 个字节(8 位) | 简洁形式:-27~ 27-1 完整表述:-128 ~ 127 | 小范围整数 | 0 |
短整型 | short | 2 个字节(16 位) | 简洁形式:-215 ~ 215-1 完整表述:-32,768 ~ 32,767 | 中等范围整数 | 0 |
整型 | int (默认) | 4 个字节(32 位) | 简洁形式:-231 ~ 231-1 完整表述:-2,147,483,648 ~ 2,147,483,647 | 默认整数类型 常用于计数器等场景 | 0 |
长整型 | long | 8 个字节(64 位) | 简洁形式:-263 ~ 263-1 完整表述:-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 大范围整数 如时间戳和大数运算 | 0L |
单精度浮点数 | float | 4 个字节(32 位) | 科学计数法:± 1.4 × 10-45 ~ ± 3.4 × 1038 | 单精度小数 6~7 位有效小数 | 0.0f |
双精度浮点数 | double (默认) | 8 个字节(64 位) | 科学计数法:± 4.9 × 10-324 ~ ± 1.8 × 10308 | 默认浮点类型 15~16 位有效小数 | 0.0d |
字符型 | char | 2 个字节(16 位) | 简洁形式:0 ~ 216-1 完整表述: 最小值:\u0000 (十进制为 0) 最大值:\uffff (十进制为 65,535) | 单字符或 Unicode 编码 | '\u0000' |
布尔类型 | boolean | 1 位(JVM 实现相关) | true 或 false | 逻辑判断,用于条件语句 | false |
1.变量概述
变量是程序中用于存储数据的基本元素。在程序运行过程中,变量的值会根据操作和逻辑的不同而发生变化。每个变量都必须指定一个数据类型,用于限定它能够存储的数据形式和范围。
2.变量的数据类型
Java 提供了两类数据类型:基本数据类型 和 引用数据类型。
2.1 基本数据类型
Java 有 8 种基本数据类型,分为以下几类:
-
整型:
byte
(1 字节,-128 ~ 127)short
(2 字节,-32,768 ~ 32,767)int
(4 字节,-2,147,483,648 ~ 2,147,483,647)long
(8 字节,-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)
-
浮点型:
float
(4 字节,单精度浮点数,6-7 位有效数字)double
(8 字节,双精度浮点数,15-16 位有效数字)
-
字符型:
char
(2 字节,0 ~ 65,535,用于表示单个字符或 Unicode 编码)
-
布尔型:
boolean
(1 位,true
或false
)
2.2 引用数据类型
引用数据类型包括:
- 类(Class)
- 数组(Array)
- 接口(Interface)
- 枚举(Enum)
- 注解(Annotation)
引用数据类型存储的是对象的引用地址,而不是对象本身的数据。
3.变量的作用
变量用于存储数据,提供了一个保存信息并在程序执行期间进行操作的机制。通过变量,程序可以灵活地接收不同的值并执行计算。
4.变量的定义与赋值
-
单独定义变量并赋值:
数据类型 变量名 = 值;
-
先定义后赋值:
数据类型 变量名; 变量名 = 值;
-
连续定义多个变量并赋值:
数据类型 变量名1 = 值1, 变量名2 = 值2, 变量名3 = 值3;
或者:
数据类型 变量名1, 变量名2, 变量名3; 变量名1 = 值1; 变量名2 = 值2; 变量名3 = 值3;
示例:
int i = 10,j = 20,k = 30;
5.变量的初始化与使用
初始化:变量在使用之前必须先被赋值,否则会导致编译错误。
使用规则:变量定义后,需根据需求对其进行赋值和修改。赋值时,右边的值将存储到左边的变量中。
6. 字符串类型
String
是一种引用数据类型,用于存储字符串数据。尽管它的使用方式与基本数据类型类似,但 String
实际上是一个类,而且它具有一些独特的特性:
-
不可变性:
String
对象是不可变的(immutable
)。一旦创建了String
对象,它的内容就不能再被改变。如果对字符串进行任何修改(如拼接、替换等),会生成一个新的String
对象,而不会修改原来的对象。 -
常量池:
String
字符串常量池(String Pool
)是 JVM 中的一项优化技术。在使用字面量创建字符串时,JVM 会首先检查常量池中是否已经存在相同的字符串。如果存在,直接引用该常量,而不是创建新的对象。这可以提高内存使用效率,并且加速字符串比较操作。 -
赋值方式:
String
可以像基本数据类型一样直接赋值,无需显式地创建对象。例如:String str = "Hello, World!";
由于其不可变特性,String
类型在多线程环境中是安全的,因此它适用于一些需要线程安全的场景。
注意:因为 String
是不可变的,如果在大量字符串拼接的场景下频繁创建新的 String
对象,可能会导致性能问题。在这种情况下,建议使用 StringBuilder
或 StringBuffer
类来代替。
7. 浮点数的精度问题
-
float
:float
类型使用32 位
存储浮点数,符合 IEEE 754 单精度浮点数标准。它能够表示的数值范围大约是:
± 1.4 × 10^-45 到 ± 3.4 × 10^38,并且通常能表示最多 7 位有效数字。
由于精度有限,不适合用于需要高精度的计算。
-
double
:double
类型使用64 位
存储浮点数,符合 IEEE 754 双精度浮点数标准。它能够表示的数值范围大约是:
± 4.9 × 10^-324 到 ± 1.8 × 10^308,并且通常能表示最多 15-16 位有效数字。
在大多数情况下,double
是默认的浮点数类型。
注意:在实际开发中,避免将 float
或 double
用于财务计算等高精度要求的场景。可以考虑使用 BigDecimal
类型来避免精度损失。
8. 变量作用域
变量的作用域决定了该变量在哪些区域内是有效的。作用域分为 局部作用域 和 全局作用域。Java 中的作用域主要有以下两种:
- 局部变量:在方法内部定义的变量,只能在当前方法或块内访问。
- 全局变量(成员变量):在类中定义的变量,可以在类的任何方法中访问。
示例:作用域的使用
public class ScopeExample {// 类变量 (全局变量),属于整个类,类的任何方法都可以访问它int globalVar = 5; // 类变量,所有方法中都可访问public void methodOne() {// 局部变量,在 methodOne() 方法内部定义,只能在该方法内使用int localVar = 10; // 局部变量System.out.println("methodOne - localVar: " + localVar); // 输出局部变量值,输出 10System.out.println("methodOne - globalVar: " + globalVar); // 输出类变量值,输出 5}public void methodTwo() {// 另一个方法内部的局部变量int localVar = 20; // 在 methodTwo 中定义的局部变量,作用域仅限于 methodTwoSystem.out.println("methodTwo - localVar: " + localVar); // 输出局部变量值,输出 20System.out.println("methodTwo - globalVar: " + globalVar); // 输出类变量值,输出 5}public void demonstrateScope() {// 在该方法内我们尝试访问前面方法中的局部变量 localVar// System.out.println(localVar); // 编译错误:localVar 只在 methodOne 或 methodTwo 中有效,无法访问}public static void main(String[] args) {// 创建对象来调用类的实例方法ScopeExample example = new ScopeExample();// 调用 methodOne(),该方法输出局部变量 localVar 和全局变量 globalVarexample.methodOne();// 调用 methodTwo(),该方法输出另一个局部变量 localVar 和同一个全局变量 globalVarexample.methodTwo();// 调用 demonstrateScope(),尝试访问方法外的局部变量(会导致错误)example.demonstrateScope(); // 编译错误:无法访问局部变量 localVar}
}
9. 变量命名规则与规范
在 Java 中,合理的变量命名有助于提高代码的可读性和维护性。以下是一些常见的命名规则和规范:
-
变量名的基本规则:
- 变量名必须以字母(a-z, A-Z)、下划线
_
或美元符号$
开头。 - 变量名可以包含字母、数字、下划线和美元符号,但不能包含空格。
- 变量名不能使用 Java 关键字(如
int
、class
等)。
- 变量名必须以字母(a-z, A-Z)、下划线
-
命名规范:
- 驼峰命名法(camelCase):通常使用小写字母开始,后续单词的首字母大写,例如:
studentAge
、totalAmount
。 - 类名:类名通常使用 帕斯卡命名法(PascalCase),即每个单词的首字母大写,例如:
StudentInfo
、UserProfile
。 - 常量:常量名通常使用全大写字母,并用下划线分隔单词,例如:
MAX_SIZE
、PI_VALUE
。
- 驼峰命名法(camelCase):通常使用小写字母开始,后续单词的首字母大写,例如:
-
命名的可读性和简洁性:
- 变量名应具有描述性,能够清晰表达其含义。避免使用无意义的命名,如
x
、temp
,而应使用具体的变量名,如studentAge
、totalAmount
。 - 尽量避免使用类似于数字或字母容易混淆的字符,如
l
和1
,O
和0
。
- 变量名应具有描述性,能够清晰表达其含义。避免使用无意义的命名,如
示例:
- 变量名:
studentAge
(表示学生年龄)、totalAmount
(表示总金额)。 - 常量名:
MAX_SIZE
(表示最大大小)、PI_VALUE
(表示圆周率值)。 - 类名:
PersonInfo
(表示个人信息类)、OrderProcessor
(表示订单处理类)。
遵循这些命名规则和规范可以使代码更易于理解和维护。
10.变量使用的注意事项
- 未初始化的变量不能使用:变量在使用之前必须进行初始化,否则会出现编译错误。
- 同一作用域内不能重复定义相同的变量:在同一作用域内,不能定义具有相同名字的变量。
- 作用域访问:小作用域内的变量可以直接访问大作用域中的变量,但大作用域内的变量不能直接访问小作用域中的变量。
示例:
public class Example {public static void main(String[] args) {int i = 10;System.out.println(i); // 输出 10int j;j = 20;System.out.println(j); // 输出 20{int x = 1000;System.out.println(i); // 输出 10}// System.out.println(x); // 编译错误,x 只在局部作用域内有效}
}