Java后端-基础-命名规范、变量与数据类型-2
背景
本文是《Java 后端从小白到大神》修仙系列第二篇,正式进入Java后端世界,本篇文章主要聊Java基础中的命名规范、变量和数据类型。若想详细学习请点击首篇博文,我们开始吧。
章节概览
- 命名规范
- 变量
- 数据类型
1. 命名规范
命名规范是编写高质量Java代码的基础,良好的命名可以提高代码的可读性和可维护性。
1. 基本命名规则
| 类型 | 规范 | 示例 |
|---|---|---|
| 类名 | 大驼峰,名词 | PaymentService |
| 方法名 | 小驼峰,动词开头 | calculateTotal() |
| 布尔方法 | is/has/can 等前缀开头 | isValid(), hasPermission() |
| 常量 | 全大写+下划线 | MAX_RETRY_COUNT |
| 变量 | 小驼峰,有意义的名称 | userName, orderId |
| 参数 | 小驼峰,简洁明了 | name, age |
| 包名 | 小写,域名反转+模块名 | com.example.service |
| 接口 | 大驼峰,形容词或名词 | Runnable, List |
| 枚举 | 大驼峰,名词 | Day, Status |
2. 命名最佳实践
类名:
- 使用名词或名词短语
- 避免使用缩写,除非是广泛认可的缩写(如HTTP、XML)
- 保持简洁明了
方法名:
- 使用动词或动词短语
- 布尔方法使用is/has/can等前缀
- 行为动词:get、set、calculate、process
- 状态动词:start、stop、initialize
变量名:
- 使用有意义的名称,避免使用单字母变量(除了循环计数器)
- 保持简洁,但不要过度缩写
- 对于布尔变量,使用is/has等前缀
常量名:
- 使用全大写字母和下划线
- 表示常量的含义
- 避免魔法数字,使用常量替代
3. 命名示例
|
|
4. 命名规范的重要性
- 提高可读性:清晰的命名使代码更容易理解
- 提高可维护性:良好的命名使代码更容易维护和修改
- 减少错误:明确的命名减少误解和错误
- 团队协作:统一的命名规范便于团队协作
- 代码质量:规范的命名是代码质量的重要指标
5. 常见命名误区
- 使用无意义的变量名(如a、b、c)
- 使用缩写过度的变量名(如usr、pwd)
- 类名使用动词
- 方法名使用名词
- 常量使用小驼峰命名
- 包名使用大写字母
2. 变量
变量是Java程序中存储数据的基本单位,不同类型的变量有不同的作用域和生命周期。
1. 局部变量(Local Variables)
局部变量是在方法、构造器或代码块内部声明的变量,仅在声明它的代码块内有效。
-
声明位置:在方法、构造器或代码块内部声明。
-
作用域:从声明处开始到所属代码块结束。
-
生命周期:方法/代码块执行期间存在。
-
默认值:无默认值,必须显式初始化。
-
示例:
实际应用场景:
- 方法内的临时计算
- 循环计数器
- 方法内的局部状态管理
2. 实例变量(Instance Variables)
实例变量是在类中声明的非静态变量,每个对象实例都有自己的副本。
-
声明位置:在类中声明,但在任何方法、构造器或代码块之外。
-
作用域:整个类内部(非静态上下文中)。
-
生命周期:与对象实例共存亡(对象创建时初始化,垃圾回收时销毁)。
-
默认值:有默认值(如
int为0,对象引用为null)。 -
示例:
实际应用场景:
- 存储对象的状态
- 类的属性和字段
- 需要在多个方法间共享的数据
3. 类变量(静态变量,Static Variables)
类变量是在类中使用 static 修饰的变量,所有对象实例共享同一个副本。
-
声明位置:在类中声明,使用
static修饰。 -
作用域:整个类(包括静态和非静态上下文)。
-
生命周期:类加载时初始化,程序结束时销毁。
-
默认值:与实例变量相同。可修改,全局生效。
-
示例:
实际应用场景:
- 类级别的常量
- 计数器和统计信息
- 共享配置和资源
4. 参数变量(Parameters)
参数变量是方法或构造器参数列表中的变量,用于接收调用者传入的值。
-
声明位置:方法或构造器的参数列表中。
-
作用域:仅限于方法或构造器内部。
-
生命周期:方法调用期间存在。
-
默认值:由调用者传入值。
-
示例:
实际应用场景:
- 方法的输入参数
- 构造器的初始化参数
- 函数的自变量
5. final 变量
final变量是一旦赋值后不可修改的变量,也称为常量。
- 特点:一旦赋值后不可修改(常量),引用类型则为内存地址不变(内部数据可变)。
- 适用场景:
- 类常量:
public static final double PI = 3.14159; - 方法参数:
void process(final int value) { ... } - 局部常量:
final int MAX_RETRIES = 3;
- 类常量:
实际应用场景:
- 数学常量(如PI)
- 配置参数(如最大重试次数)
- 避免方法内部修改参数值
6. 枚举变量(Enum)
枚举是一种特殊的类,用于定义一组命名常量。
-
特点:预定义一组命名常量,类型安全。
-
示例:
实际应用场景:
- 表示一组相关的常量(如星期、月份)
- 状态码和错误码
- 配置选项和类型
7. 资源变量(Try-with-Resources)
资源变量是在 try 语句中声明的变量,会在 try 块执行完毕后自动关闭。
-
特点:在
try语句中声明,自动管理资源关闭。 -
示例:
实际应用场景:
- 文件操作(文件读写)
- 网络连接
- 数据库连接
- 其他需要关闭的资源
8. 变量作用域对比表
| 变量类型 | 声明位置 | 作用域 | 生命周期 | 默认值 |
|---|---|---|---|---|
| 局部变量 | 方法/代码块内 | 代码块内部 | 方法/代码块执行期间 | 无 |
| 实例变量 | 类内部(非静态) | 类内部(非静态上下文) | 与对象实例共存亡 | 有 |
| 类变量 | 类内部(静态) | 整个类及类实例 | 类加载到程序结束 | 有 |
| 参数变量 | 方法/构造器参数列表 | 方法/构造器内部 | 方法调用期间 | 传入值 |
9. 关键注意事项
-
默认值规则:
- 实例变量和类变量有默认值。
- 局部变量必须显式初始化,否则编译错误。
-
变量隐藏(Shadowing):
-
局部变量或参数变量可能与实例变量同名,此时使用
this访问实例变量。
-
-
类型转换:
-
基本类型:自动转换(小范围→大范围)或强制转换。
-
引用类型:向上转型(安全)、向下转型(需类型检查)。
-
-
变量命名最佳实践:
- 使用有意义的变量名
- 遵循命名规范
- 保持变量作用域尽可能小
- 避免使用过多的全局变量
- 合理使用final修饰符
-
内存管理:
- 局部变量在方法执行完毕后会被回收
- 实例变量在对象被垃圾回收时回收
- 类变量在程序结束时回收
- 资源变量会在try-with-resources块结束时自动关闭
3. 数据类型
Java的数据类型分为基本数据类型和引用数据类型,它们在存储方式和使用场景上有很大不同。
1. 基本数据类型(Primitive Types)
基本数据类型是Java中最基本的数据类型,直接存储值,不需要进行内存分配和垃圾回收。
Java 的 8种基本数据类型:
| 类型 | 大小(位) | 默认值 | 取值范围/描述 | 实际应用场景 |
|---|---|---|---|---|
byte |
8 | 0 | -128 到 127 | 字节数据、文件操作、网络传输;1 字节 = 8 位二进制(00000000 ~ 11111111) |
short |
16 | 0 | -32,768 到 32,767 | 内存受限场景、小整数 |
int |
32 | 0 | -2³¹ 到 2³¹-1 | 一般整数运算、计数器 |
long |
64 | 0L | -2⁶³ 到 2⁶³-1 | 大整数、时间戳、文件大小 |
float |
32 | 0.0f | IEEE 754 单精度浮点数 | 科学计算、图形处理 |
double |
64 | 0.0d | IEEE 754 双精度浮点数 | 一般浮点数运算、金融计算 |
char |
16 | ‘\u0000’ | Unicode 字符(0 到 65,535) | 字符处理、文本操作 |
boolean |
1(实际) | false | true 或 false |
条件判断、开关状态 |
示例:
使用建议:
- 选择合适的数据类型以节省内存
- 对于整数,优先使用
int,只有需要更大范围时才使用long - 对于浮点数,优先使用
double,除非有特殊需求才使用float - 避免在浮点数比较中使用
==,应使用Math.abs(a - b) < DEFAULT_EPSILON。一般double类型定义默认的精度阈值,DEFAULT_EPSILON = 1e-9,float 类型定义DEFAULT_EPSILON = 1e-6。
2. 引用数据类型(Reference Types)
引用数据类型存储对象的引用(内存地址),而不是直接存储值。
| 类型 | 描述 | 示例 | 实际应用场景 |
|---|---|---|---|
| 类类型 | 用户定义的类或Java内置类 | String, ArrayList |
封装数据和行为、面向对象编程 |
| 接口类型 | 用户定义的接口 | List, Runnable |
定义行为契约、实现多态 |
| 数组类型 | 基本类型或引用类型的数组 | int[], String[][] |
存储多个相同类型的数据 |
| 枚举类型 | 使用 enum 定义的枚举 |
enum Day { MON, TUE } |
表示一组相关的常量 |
| Lambda表达式 | 函数式接口的实现 | Runnable r = () -> {}; |
函数式编程、简化代码 |
| BigDecimal | BigDecimal 是 Java java.math 包下的类,专门用于高精度的十进制数值计算和表示,解决 float/double 浮点数因二进制存储导致的精度丢失问题(比如 0.1+0.2≠0.3) | // 推荐创建方式(无精度丢失)BigDecimal a = new BigDecimal("0.1");BigDecimal b = BigDecimal.valueOf(0.2); // 等价于 new BigDecimal("0.2") |
金融 / 金额计算:比如订单金额、税费、转账金额(必须用 BigDecimal,禁止用浮点数) |
示例:
使用建议:
- 优先使用接口类型作为变量类型,而不是具体实现类
- 合理使用包装类(如
Integer、Double)处理 null 值 - 注意引用类型的 null 检查,避免 NullPointerException
- 使用
instanceof进行类型检查,确保类型安全
3. 基本类型与引用类型的区别
| 特性 | 基本数据类型 | 引用数据类型 |
|---|---|---|
| 存储方式 | 直接存储值 | 存储内存地址 |
| 内存分配 | 栈内存 | 堆内存(引用在栈) |
| 默认值 | 有默认值 | null |
| 传递方式 | 值传递 | 引用传递(地址传递) |
| 比较方式 | == 比较值 |
== 比较地址,equals() 比较内容 |
| 内存管理 | 自动管理 | 垃圾回收 |
4. 包装类(Wrapper Classes)
Java为每种基本数据类型提供了对应的包装类,用于在需要对象的场景中使用。
| 基本类型 | 包装类 | 示例 |
|---|---|---|
byte |
Byte |
Byte b = 10; |
short |
Short |
Short s = 100; |
int |
Integer |
Integer i = 1000; |
long |
Long |
Long l = 10000L; |
float |
Float |
Float f = 3.14f; |
double |
Double |
Double d = 3.14159; |
char |
Character |
Character c = 'A'; |
boolean |
Boolean |
Boolean b = true; |
自动装箱与拆箱:
实际应用场景:
- 集合类中存储基本类型(如
List<Integer>) - 泛型中使用(泛型不支持基本类型)
- 需要 null 值的场景
- 与数据库交互时的类型转换
5. 类型转换
基本类型转换
自动转换(隐式转换):小范围 → 大范围
强制转换(显式转换):大范围 → 小范围(可能会丢失精度)
引用类型转换
向上转型:子类 → 父类(安全,自动转换)
向下转型:父类 → 子类(需要显式转换,可能抛出 ClassCastException)
6. 数据类型最佳实践
-
选择合适的数据类型:
- 根据数据范围选择合适的整数类型
- 根据精度需求选择合适的浮点数类型
- 对于布尔值,使用
boolean类型
-
避免不必要的装箱拆箱:
- 在循环中避免频繁的装箱拆箱操作
- 优先使用基本类型进行计算
-
注意浮点数精度问题:
- 对于金融计算,考虑使用
BigDecimal - 避免直接比较浮点数是否相等
- 对于金融计算,考虑使用
-
合理使用包装类:
- 在需要 null 值的场景使用包装类
- 在集合和泛型中使用包装类
-
类型安全:
- 使用
instanceof进行类型检查 - 避免不安全的类型转换
- 合理使用泛型确保类型安全
- 使用
总结
本文详细介绍了Java基础中的命名规范、变量和数据类型,这些是Java编程的基础要素,需要熟练掌握。
-
命名规范:
- 基本命名规则:类名、方法名、变量名、常量名等的命名规范
- 命名最佳实践:使用有意义的名称,遵循大小写约定
- 命名规范的重要性:提高代码可读性和可维护性
- 常见命名误区:避免使用无意义的变量名和过度缩写
-
变量:
- 局部变量:方法或代码块内的临时变量
- 实例变量:对象的属性和状态
- 类变量:类级别的静态变量
- 参数变量:方法的输入参数
- final变量:不可修改的常量
- 枚举变量:预定义的常量集合
- 资源变量:自动管理的资源
-
数据类型:
- 基本数据类型:8种基本类型及其特点
- 引用数据类型:类、接口、数组、枚举、Lambda表达式
- 基本类型与引用类型的区别:存储方式、内存分配、传递方式等
- 包装类:基本类型的对象表示
- 类型转换:自动转换和强制转换
- 数据类型最佳实践:选择合适的类型,避免不必要的装箱拆箱
通过扎实掌握本文介绍的基础知识,你将为后续的Java学习和开发打下坚实的基础。记住,编程是一门实践的艺术,不断练习和积累经验是提高编程技能的关键。
文章作者 会写代码的小郎中
上次更新 2018-06-03
许可协议 CC BY-NC-ND 4.0