跳转至

2 常量与变量

关键字

Java 中的关键字都是小写,且不能作为标识符(如变量名、类名)使用。关键字用于定义 Java 程序的结构、控制流程、数据类型等核心逻辑,以下是按功能分类的常见关键字:

类别 关键字举例
访问修饰符 public(公共)、private(私有)、protected(受保护)、default(默认,无关键字)
数据类型 int、double、boolean、char、byte、short、long、float、void、class、interface
流程控制 if、else、switch、case、default、for、while、do、break、continue、return
面向对象 new、this、super、extends(继承)、implements(实现)、static、final、abstract
异常处理 try、catch、finally、throw、throws
其他核心 package(包)、import(导入)、enum(枚举)、assert(断言)、synchronized(同步)

注意truefalsenull 虽然常用且符合关键字的“小写”特征,但它们是字面量,并非关键字,不过同样不能作为标识符使用。

标识符

标识符是 Java 中用于给类、变量、方法、包等命名的符号。

命名规则(硬性要求)

必须遵循以下规则,否则会编译报错:

  • 由字母(A-Z、a-z)、数字(0-9)、下划线(_)、美元符号($)组成。
  • 不能以数字开头(例如 123Name 是非法的,Name123 是合法的)。
  • 不能使用 Java 关键字和字面量(例如 classinttrue 不能作为标识符)。
  • 区分大小写(例如 Namename 是两个不同的标识符)。
  • 无长度限制,但建议简洁易懂(过长的标识符会降低代码可读性)。

命名规范(软性建议,行业通用)

遵循规范可提高代码的可读性和团队协作效率,主流规范如下:

  • 类名/接口名:采用“帕斯卡命名法(大驼峰命名法)”,每个单词首字母大写,其余小写。 示例:HelloWorld(类名)、UserService(接口名)。
  • 变量名/方法名:采用“(小)驼峰命名法”,首字母小写,后续单词首字母大写。 示例:userAge(变量名)、calculateSum(方法名)。
  • 常量名:全部大写,多个单词之间用下划线(_)分隔。 示例:MAX_SCOREDB_URL
  • 包名:全部小写,多层级包用小数点(.)分隔,通常以公司域名倒写开头(避免命名冲突)。 示例:com.company.project.util(工具类包)、com.company.project.entity(实体类包)。

基本数据类型

Java 是强类型语言,变量在使用前必须声明数据类型,且数据类型一旦确定,不可随意更改。Java 数据类型分为两大类:基本数据类型引用数据类型

基本数据类型(8种,直接存储值)

基本数据类型是 Java 内置的基础类型,直接存储数据本身,而非内存地址,分为四类八种:

类型分类 数据类型 占用字节 取值范围 默认值 适用场景
整数型 byte 1 -128 ~ 127 0 存储小范围整数(如状态码)
short 2 -32768 ~ 32767 0 存储中等范围整数
int 4 -2^31 ~ 2^31 - 1(约 -21亿 ~ 21亿) 0 默认整数类型(最常用)
long 8 -2^63 ~ 2^63 - 1(约 -9e18 ~ 9e18) 0L 存储大范围整数(需加 L 后缀)
浮点型 float 4 负数:-3.402823E+38到-1.401298E-45 正数: 1.401298E-45到3.402823E+38(精度约 6-7 位小数) 0.0F 单精度浮点数(需加 F 后缀)
double 8 约 ±1.8e308(精度约 15-17 位小数) 0.0D 默认浮点类型(最常用)
字符型 char 2 '\u0000'(空格) ~ '\uffff'(65535个字符) '\u0000' 存储单个字符(用单引号包裹)
布尔型 boolean 1(理论) true(真)、false(假) false 表示逻辑判断结果

在 java 中整数默认是 int 类型,浮点数默认是 double 类型。

示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
// 整数型
byte status = 1;               // 状态码(1表示成功)
short score = 95;              // 分数
int population = 1400000000;   // 人口数量(int范围内)
long distance = 15000000000L;  // 距离(超出int范围,需加L后缀)

// 浮点型
float pi1 = 3.14F;             // 单精度圆周率(需加F后缀)
double pi2 = 3.1415926;        // 双精度圆周率(默认浮点类型,无需后缀)

// 字符型
char ch1 = 'A';                // 单个字母
char ch2 = '中';               // 单个汉字(Java中char支持Unicode编码)
char ch3 = '\u0041';           // 用Unicode编码表示'A'(与ch1值相同)

// 布尔型
boolean isPass = true;         // 是否通过考试
boolean hasLogin = false;      // 是否登录

引用数据类型(存储内存地址)

引用数据类型不直接存储数据,而是存储数据在内存中的“地址”,通过地址引用实际数据。常见的引用数据类型包括: - 类(Class):如 String(字符串类)、Integer(包装类)、自定义类(如 User)。 - 接口(Interface):如 ListMap。 - 数组(Array):如 int[](整数数组)、String[](字符串数组)。 - 枚举(Enum)、注解(Annotation)等。

示例代码

1
2
3
4
5
6
7
8
9
// 字符串类(引用类型)
String name = "Java";    // name 存储的是 "Java" 在内存中的地址

// 数组(引用类型)
int[] scores = {90, 85, 95}; // scores 存储数组的内存地址

// 自定义类(引用类型)
class User {}
User user = new User();  // user 存储 User 对象的内存地址

基本类型与引用类型的核心区别

对比维度 基本数据类型 引用数据类型
存储内容 直接存储数据值 存储对象的内存地址
内存分配位置 栈内存(Stack) 对象存堆内存(Heap),引用存栈内存
默认值 有明确默认值(如 int 为 0) 默认值为 null(表示无引用对象)
赋值方式 赋值时直接拷贝值 赋值时拷贝的是内存地址(两个引用指向同一对象)

常量

常量是指在程序运行过程中,值不能被修改的量。Java 中定义常量需使用 final 关键字修饰,通常结合命名规范(全部大写)使用。

常量的分类

根据作用范围,常量可分为以下两类:

字面值常量

直接在代码中写死的值,无需定义,可直接使用,对应基本数据类型和字符串类型: - 整数常量:如 123(int 类型)、100L(long 类型)、0xFF(十六进制,对应 255)。 - 浮点常量:如 3.14(double 类型)、2.5F(float 类型)。 - 字符常量:如 'a''5''中'。 - 布尔常量:truefalse。 - 字符串常量:如 "Hello""Java 基础"(注意用双引号包裹)。 - 空常量:null(仅引用类型可用,表示无对象引用)。

自定义常量

使用 final 关键字定义的常量,一旦赋值,后续无法修改。语法格式:

1
2
// 语法:final 数据类型 常量名 = 常量值;
final 数据类型 常量名 = 常量值;

变量

变量是程序运行过程中,值可以被修改的量。Java 作为强类型语言,变量必须先声明(指定数据类型),再赋值(赋予具体值),最后才能使用。

变量的声明与赋值

声明变量

语法:数据类型 变量名;(仅声明类型,未赋值时,变量为默认值,但局部变量无默认值,必须手动赋值后才能使用)。

赋值变量

语法:变量名 = 值;(赋值符号 = 表示将右侧的值赋给左侧的变量)。

声明并赋值

语法:数据类型 变量名 = 值;(一步完成,简洁高效)。

使用变量时的注意事项

  1. 在同一对花括号中,变量名不能重复。
  2. 变量在使用之前,必须初始化(赋值)。
  3. 定义long类型的变量时,需要在整数的后面加L(大小写均可,建议大写)。因为整数默认是int类型,整数太 大可能超出int范围。
  4. 定义float类型的变量时,需要在小数的后面加F(大小写均可,建议大写)。因为浮点数的默认类型是 double, double的取值范围是大于float的,类型不兼容。

类型转换

由于 Java 是强类型语言,不同数据类型之间的赋值需要进行“类型转换”。类型转换分为两种:自动类型转换(隐式转换)和强制类型转换(显式转换)。

自动类型转换(隐式转换)

当两种数据类型兼容,且目标类型的“取值范围”大于源类型时,Java 会自动完成转换,无需手动干预。

转换规则
  • 整数型之间:byte → short → int → long(范围从小到大,自动转换)。
  • 整数型转浮点型:int → float → doublelong → double(浮点型范围大于整数型)。
  • 字符型转整数型:char → int(char 本质是 Unicode 编码值,可自动转为 int)。

核心原则小范围类型 → 大范围类型(避免数据丢失)。

强制类型转换(显式转换)

当两种数据类型兼容,但目标类型的“取值范围”小于源类型时,需要手动使用“强制转换符”(目标类型) 进行转换。

转换规则
  • 语法:目标类型 变量名 = (目标类型) 源变量;
  • 适用场景:long → intdouble → intfloat → byte 等(大范围类型 → 小范围类型)。
  • 风险:可能导致“数据溢出”或“精度丢失”(因为小范围类型无法完全容纳大范围类型的值)。

不兼容的类型转换(无法转换)

与 C/C++ 不同,Java 不允许boolean 类型转换为整型,也不允许整型转换为 boolean 类型。

若两种数据类型完全不兼容(如 Stringintbooleanint),则无法进行自动或强制转换,否则编译报错。

boolean 类型不能与其他基本数据类型进行转换。

错误示例

1
2
3
4
5
6
7
// 1. String → int(不兼容,无法转换)
String str = "123";
// int num = (int) str; // 编译报错:不兼容的类型

// 2. boolean → int(不兼容,无法转换)
boolean flag = true;
// int b = (int) flag; // 编译报错:不兼容的类型