本章分层
- 必读:变量是什么、变量声明与初始化、基本类型概览
- 选读:
var关键字、命名规范- 进阶:JVM 内存中变量的存储布局——第5章会讲
本章不会要求你掌握
- 所有基本类型的二进制表示细节
- 引用类型与基本类型的底层差异
变量村的清晨,老陈师傅的工坊
工坊里飘着一股铁锈和旧木头的味道。老陈把 HelloWorld 那张纸钉在墙上。"第一句话你已经会说。"他转身从抽屉里翻出一张发黄的旅行地图——画着一个村庄,每栋房子外面挂着牌子:整数仓库、小数银行、字符驿站、真假哨站。
"变量村不是白叫的。"他把地图摊在桌上,"计算机里面,每个变量都是一栋小房子——有个门牌号(叫名字),有个房间(占内存),里面住着东西(叫值)。今天的任务:认识这里所有类型的房子。"
第一个问题:存一个数字
"Hello World!" 是一个写死的句子。如果把程序比作菜谱,那它只写了"放盐"——但盐放多少、什么时候放、放在哪个碗里,全都没写。
真实程序里,数据是变化的:今天用户叫张三,明天可能叫李四;今天是 18 度,明天可能是 25 度。你不能每次数据变了就改源代码重新编译——那太傻了。
你需要一个办法:在内存里划出一块区域,给这块区域起个名字,往里面放东西,随时能拿出来用或者换成别的——这就是变量。
我凭直觉写:
x = 5编译——报错。老陈师傅并不意外。
"Java 不让你这么干。它要你提前说清楚:你要存的东西是什么种类、占多大空间。"
在 Java 里,声明一个变量需要两样东西:类型和名字。
// VariablesDemo.java
public class VariablesDemo {
public static void main(String[] args) {
int score = 95;
System.out.println(score);
}
}如何运行:
javac VariablesDemo.java→java VariablesDemo预期输出:95
"int 是类型名,意思是整数。score 是变量名,你用这个名字来引用这块内存。"
int score = 95; // 声明 + 赋值,一步到位他接着写:
int score; // 只声明:告诉 Java 我要一个叫 score 的整数容器
score = 95; // 再赋值:往容器里放数据"声明和赋值可以分开做。但你不能拿了空容器就乱用——Java 编译器会检查你有没有给变量初始化。"
int score;
System.out.println(score); // 编译错误:variable score might not have been initializedPython 差异: Python 不需要提前告诉电脑类型——直接写
score = 95就好,自动推断。方便,但也容易不小心把score赋值为字符串"hello",后面用到score + 5就抛运行时异常了。Java 是静态类型——变量类型一旦声明,终生不变。
八种基本类型概览
"整数有四种。"老陈师傅用粉笔敲了敲黑板:
| 类型 | 大小 | 取值范围 | 默认值 |
|---|---|---|---|
byte | 1 字节 | -128 ~ 127 | 0 |
short | 2 字节 | -32768 ~ 32767 | 0 |
int | 4 字节 | -2^31 ~ 2^31-1 | 0 |
long | 8 字节 | -2^63 ~ 2^63-1 | 0L |
"小数有两种:"
| 类型 | 大小 | 精度 | 默认值 |
|---|---|---|---|
float | 4 字节 | ~7 位有效数字 | 0.0f |
double | 8 字节 | ~15 位有效数字 | 0.0d |
"还有另外两种——跟数字无关:"
char grade = 'A'; // 单个字符,用单引号包住
boolean isReady = true; // 真或假,只有两个值别着急记住所有数字。最常用的就是
int和double。其他几个遇到时再回来查表就行。
var——偷懒的正确方式
"Java 10 之后,你有一种偷懒的办法。"老陈师傅又写:
var name = "Alice"; // 编译器自己推断:name 是 String 类型
var count = 42; // 编译器自己推断:count 是 int 类型
var pi = 3.14; // 编译器自己推断:pi 是 double 类型这叫类型推断。你写 var,编译器看等号右边的值,自己判断类型。但有个重要的限制:var 必须在声明时就赋值,而且赋值之后类型就锁死了——你不能声明 var x; 然后再赋值。
var x; // 编译错误:cannot infer type for local variable x
x = 10;
var n = 100;
n = "hello"; // 编译错误:n 已经被推断为 int,不能再赋字符串"还有,var 只能用在方法内部的局部变量——不能用它做类成员变量、方法参数、或者方法返回值。"
Java 帮你做了声明的工作,但没妥协类型安全。这是 Python 的灵活和 Java 的严谨之间的一个中间地带。
旅人笔记
变量就像一个带标签的盒子。
你告诉 Java:"我要一个叫 score 的盒子,它只能装 int 类型的东西。" Java 就在内存里给你分配一个 4 字节的"盒子"。然后你把 95 放进去。以后每次用 score 这个名字,Java 就帮你打开那个盒子取出值。
这八个基本类型(byte short int long float double char boolean)是 Java 的"原子"——它们不是由其他类型组合而成的。所有复杂的东西最终都是由这些原子拼出来的。
命名规范是好习惯: 变量名用驼峰风格——第一个单词全小写,后面的单词首字母大写:myScore、playerName、isGameOver。
老陈师傅贴了一张纸条在墙上:
变量让你能记住东西。 类型让你不会记错。 名字让你能找到它。
→ 下一步:深入数据类型
你认识了变量之门,看到了八种基本类型的轮廓。下一站我们走进每一种类型的房间,看看:
int到底能存多大?超过会怎样?double为什么算0.1 + 0.2不等于0.3?char和boolean的特殊规则
第2章续:类型详解