第 2 章 · 变量、基本类型与运算符
本章目标:掌握 Java 静态类型变量声明与命名规范;熟练使用 8 种基本类型及 String 引用;理解 自动装箱/拆箱 与 null;掌握算术、比较、逻辑、位运算与赋值运算符;能进行显式/隐式类型转换;编写 toolkit-demo 中的价格计算示例,并与 python-dev ch02 对照。
学时建议:3~4 小时(含 1 小时跟练)
前置:完成 java-dev ch01,能编译运行 HelloWorld;建议已学 python-dev ch02。
2.1 场景说明:toolkit-demo 商品计价
toolkit-demo 需要一个小模块计算虚构商品「学习套件」的单价、数量与小计,逻辑类似 python-dev 中 shop-demo 脚本的价格计算,但 Java 必须在编译期确定类型。
| 字段 | Java 类型 | Python 对照 |
|---|---|---|
| 商品名 | String | str |
| 单价 | double 或 BigDecimal(进阶) | float |
| 数量 | int | int |
| 是否促销 | boolean | bool |
| 小计 | double | 动态 float |
learn-java/toolkit-demo/src/main/java/demo/pricing/
└── PriceCalculator.java # 本章主练习
2.2 变量与命名
Java 变量必须先声明类型再使用(局部变量)。
String productName = "Java 学习套件";
int quantity = 3;
double unitPrice = 89.5;
boolean onSale = true;
| 规则 | 说明 | 示例 |
|---|---|---|
| 合法字符 | 字母、数字、_、$ | userName |
| 不能以数字开头 | 编译错误 | 2price ✗ |
| 区分大小写 | Price ≠ price | — |
| 风格 | 变量/方法 camelCase | totalAmount |
| 类名 | PascalCase | PriceCalculator |
| 常量 | UPPER_SNAKE + final | MAX_QUANTITY |
final int MAX_QUANTITY = 99;
int a = 1, b = 2, c = 3; // 同类型可一行声明
与 Python 对比:Python x = 10 运行时绑定类型;Java int x = 10 类型在编译期固定,赋值 x = "hi" 会编译失败。
2.3 基本数据类型
| 类型 | 字节 | 范围/说明 | 默认值(成员变量) |
|---|---|---|---|
byte | 1 | -128~127 | 0 |
short | 2 | ±3 万 | 0 |
int | 4 | 常用整数 | 0 |
long | 8 | 后缀 L | 0L |
float | 4 | 后缀 f,精度低 | 0.0f |
double | 8 | 默认浮点 | 0.0d |
char | 2 | 单字符 'A' | '\u0000' |
boolean | — | true/false | false |
int stock = 100;
long big = 9_000_000_000L; // 下划线提高可读性(Java 7+)
double price = 19.9;
float rate = 0.15f;
char grade = 'A';
boolean inStock = stock > 0;
2.3.1 引用类型与 null
除 8 种基本类型外,其余均为引用类型(类、接口、数组、String)。
String title = "toolkit-demo";
String empty = null; // 仅引用可为 null
// int n = null; // 编译错误
| Python | Java |
|---|---|
None | null(引用) |
| 一切是对象 | 基本类型不是对象 |
2.3.2 包装类与自动装箱
Integer boxed = 42; // 自动装箱 int → Integer
int unboxed = boxed; // 自动拆箱
Integer maybe = null;
// int bad = maybe; // 运行时空指针 NPE
常用包装:Integer、Long、Double、Boolean、Character。
2.4 String 初识(ch04 深入)
String shop = "示例书店";
String msg = shop + ":欢迎学习 Java"; // 拼接
String formatted = String.format("单价 %.2f 元", 19.9);
| 对比 | Python | Java |
|---|---|---|
| 格式化 | f"{x:.2f}" | String.format 或 ch04 的 formatted |
| 可变字符串 | 无特殊要求 | 大量拼接用 StringBuilder(ch04) |
2.5 运算符
2.5.1 算术运算符
int a = 10, b = 3;
int sum = a + b; // 13
int mod = a % b; // 1
double div = (double) a / b; // 3.333... 整数除法 a/b 为 3
| 运算符 | 说明 | 注意 |
|---|---|---|
+ - * / % | 算术 | / 两 int 为整除 |
++ -- | 自增自减 | 前缀/后缀语义不同 |
2.5.2 比较与逻辑
boolean ok = (price >= 0) && (quantity > 0);
boolean flag = !onSale;
boolean either = (a == 0) || (b == 0);
| 运算符 | 说明 | ||
|---|---|---|---|
== != | 基本类型比较值;引用比较地址(String 用 equals) | ||
> < >= <= | 比较 | ||
&& `\ | \ | !` | 逻辑与、或、非 |
& `\ | ^ ~` | 位运算 |
String 比较:
String s1 = "java";
String s2 = new String("java");
System.out.println(s1 == s2); // false(地址)
System.out.println(s1.equals(s2)); // true(内容)
2.5.3 赋值与复合赋值
quantity += 2;
price *= 0.9; // 促销 9 折
2.6 类型转换
2.6.1 隐式 widening(拓宽)
小范围类型可自动转为大范围:
int i = 100;
long l = i; // OK
double d = l; // OK
byte → short → int → long → float → double
char → int