跳到内容

本章分层

  • 必读:变量是什么、变量声明与初始化、基本类型概览
  • 选读var 关键字、命名规范
  • 进阶:JVM 内存中变量的存储布局——第5章会讲

本章不会要求你掌握

  • 所有基本类型的二进制表示细节
  • 引用类型与基本类型的底层差异

变量村的清晨,老陈师傅的工坊

工坊里飘着一股铁锈和旧木头的味道。老陈把 HelloWorld 那张纸钉在墙上。"第一句话你已经会说。"他转身从抽屉里翻出一张发黄的旅行地图——画着一个村庄,每栋房子外面挂着牌子:整数仓库、小数银行、字符驿站、真假哨站。

"变量村不是白叫的。"他把地图摊在桌上,"计算机里面,每个变量都是一栋小房子——有个门牌号(叫名字),有个房间(占内存),里面住着东西(叫)。今天的任务:认识这里所有类型的房子。"


第一个问题:存一个数字

"Hello World!" 是一个写死的句子。如果把程序比作菜谱,那它只写了"放盐"——但盐放多少、什么时候放、放在哪个碗里,全都没写。

真实程序里,数据是变化的:今天用户叫张三,明天可能叫李四;今天是 18 度,明天可能是 25 度。你不能每次数据变了就改源代码重新编译——那太傻了。

你需要一个办法:在内存里划出一块区域,给这块区域起个名字,往里面放东西,随时能拿出来用或者换成别的——这就是变量

我凭直觉写:

java
x = 5

编译——报错。老陈师傅并不意外。

"Java 不让你这么干。它要你提前说清楚:你要存的东西是什么种类、占多大空间。"

在 Java 里,声明一个变量需要两样东西:类型名字

java
// VariablesDemo.java
public class VariablesDemo {
    public static void main(String[] args) {
        int score = 95;
        System.out.println(score);
    }
}

如何运行: javac VariablesDemo.javajava VariablesDemo预期输出: 95

"int 是类型名,意思是整数。score 是变量名,你用这个名字来引用这块内存。"

java
int score = 95; // 声明 + 赋值,一步到位

他接着写:

java
int score;      // 只声明:告诉 Java 我要一个叫 score 的整数容器
score = 95;      // 再赋值:往容器里放数据

"声明和赋值可以分开做。但你不能拿了空容器就乱用——Java 编译器会检查你有没有给变量初始化。"

java
int score;
System.out.println(score); // 编译错误:variable score might not have been initialized

Python 差异: Python 不需要提前告诉电脑类型——直接写 score = 95 就好,自动推断。方便,但也容易不小心把 score 赋值为字符串 "hello",后面用到 score + 5 就抛运行时异常了。Java 是静态类型——变量类型一旦声明,终生不变。


八种基本类型概览

"整数有四种。"老陈师傅用粉笔敲了敲黑板:

类型大小取值范围默认值
byte1 字节-128 ~ 1270
short2 字节-32768 ~ 327670
int4 字节-2^31 ~ 2^31-10
long8 字节-2^63 ~ 2^63-10L

"小数有两种:"

类型大小精度默认值
float4 字节~7 位有效数字0.0f
double8 字节~15 位有效数字0.0d

"还有另外两种——跟数字无关:"

java
char grade = 'A';       // 单个字符,用单引号包住
boolean isReady = true; // 真或假,只有两个值

别着急记住所有数字。最常用的就是 intdouble。其他几个遇到时再回来查表就行。


var——偷懒的正确方式

"Java 10 之后,你有一种偷懒的办法。"老陈师傅又写:

java
var name = "Alice";  // 编译器自己推断:name 是 String 类型
var count = 42;      // 编译器自己推断:count 是 int 类型
var pi = 3.14;       // 编译器自己推断:pi 是 double 类型

这叫类型推断。你写 var,编译器看等号右边的值,自己判断类型。但有个重要的限制:var 必须在声明时就赋值,而且赋值之后类型就锁死了——你不能声明 var x; 然后再赋值。

java
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 的"原子"——它们不是由其他类型组合而成的。所有复杂的东西最终都是由这些原子拼出来的。

命名规范是好习惯: 变量名用驼峰风格——第一个单词全小写,后面的单词首字母大写:myScoreplayerNameisGameOver

老陈师傅贴了一张纸条在墙上:

变量让你能记住东西。 类型让你不会记错。 名字让你能找到它。


→ 下一步:深入数据类型

你认识了变量之门,看到了八种基本类型的轮廓。下一站我们走进每一种类型的房间,看看:

  • int 到底能存多大?超过会怎样?
  • double 为什么算 0.1 + 0.2 不等于 0.3
  • charboolean 的特殊规则

第2章续:类型详解

Built with VitePress | Software Systems Atlas