☕ 第二章 Java编程基础

2.2 Java中的变量

📄 一句话概括

变量 = 给内存里的一个格子贴上标签:标签是变量名,格子大小由数据类型定,里面装着可以随时换的值。程序从这一节起学会"记住东西"。三条使用铁律:先声明再使用、类型不能换、局部变量必须先赋值再用。

📝 这是全书最重要的一节之一

变量是编程的第一块砖——后面所有章节(数组、对象、方法传参)全建立在它上面。好在这节不抽象:一句话"给内存格子贴标签",剩下的全是规矩和练习。


1. 变量是什么(用大白话说透)

回忆1.4:程序运行时,数据都住在内存里。内存可以理解成一排格子(1.2 篇讲过 1 Byte = 8 bit 的老地基)。

变量 = 一个格子 + 一张标签:

int age = 18;      // 定义:int 类型的格子,标签叫 age,装 18
age = 20;          // 重新赋值:标签不动,格子里的 18 换成 20
📝 为什么值能换、类型不能换?

格子是声明类型时一次性定死的——int 的格子就是按装整数造的。装整数格子里放个 "你好",编译器直接拒绝:格子尺寸和形状对不上。所以 Java 有句行话:强类型语言——每种数据必须装进匹配类型的格子。


2. 定义变量的三种写法

// 写法 1:先声明,后赋值
int age;
age = 18;

// 写法 2:声明的同时赋值(最常用)
int age = 18;

// 写法 3:一次定义多个同类型变量(逗号隔开,少用——可读性差)
int a = 1, b = 2, c = 3;
💡 `=` 不是"等于",是"把右边的装进左边"!

这是所有编程语言的通用规矩:= 叫赋值号,读作"把右边的值放进左边的格子"。真正的"等于"判断是 ==(第三章讲)。从今天起改口:age = 18 读作"把 18 赋给 age",别读成"age 等于 18"。


3. 变量的使用(跑一遍就懂)

public class Demo02 {
    public static void main(String[] args) {
        // 1. 定义变量
        int age = 18;
        double price = 9.9;
        String name = "波仔";

        // 2. 使用变量:打印(喊标签名,输出格子里的内容)
        System.out.println(name);   // 波仔
        System.out.println(age);    // 18

        // 3. 参与计算
        System.out.println(age + 1);          // 19(age 的值加 1)

        // 4. 重新赋值
        age = 19;
        System.out.println(age);    // 19(格子内容换了)

        // 5. 用旧值算出新值,装回自己
        age = age + 1;              // 先算右边 age+1=20,再装回 age
        System.out.println(age);    // 20
    }
}
📝 第 5 条是编程高频套路

age = age + 1 数学上不成立,程序里天天用——先算右边(把格子里的 19 取出来加 1 得 20),再装回去。这个"自产自销"模式以后到处都是,现在就读顺它。


4. 作用域:标签只在自己那间屋里有效

变量在哪个 {} 里定义,就只在那个 {} 里能用——出了花括号,标签就失效。这个范围叫作用域:

public class Demo03 {
    public static void main(String[] args) {
        int age = 18;                 // 定义在 main 的大括号里
        System.out.println(age);      // ✓ 在屋里,能用
    }
    // 这里再用 age 就报错:找不到符号(出了 main 的屋子)
}

实用结论:报错 找不到符号 符号: 变量 age,八成是定义和使用不在同一层花括号里,或者名字打错了。这是新手三大报错之一,先记脸熟。


5. 三条使用铁律

❗ 铁律 1:先声明,再使用

Java 是从上往下逐句执行的。用到某个变量时,它的定义行必须在前面已经出现过。没声明就用 → 找不到符号。

❗ 铁律 2:类型定了就不能换

int age = 18; 之后 age = "十八"; → 报错:不兼容的类型。值可以换,换的必须是同类型的值(类型之间怎么"转换",2.x 后面专讲)。

❗ 铁律 3:局部变量必须先赋值再用

int n; System.out.println(n); → 编译报错:可能尚未初始化。1.4 说过局部变量住栈区、随方法结束自动清——Java 不给它默认值,逼你先赋值再用,防止用到脏数据。


6. 常见误区

⚠️ 误区 1:`age = 18` 读作"age 等于 18"?

不对,= 是赋值号:把右边的值装进左边的格子。数学的"等于"以后用 == 表达。从这节起养成新读法。

⚠️ 误区 2:同一个方法里可以定义两个 `int age`?

不行,同一作用域内标签不能重名——一格一标签,两个标签指一个格子会打架。报错:已在方法中定义了变量 age。不同层花括号里可以同名(第三章讲流程控制时会撞见)。

⚠️ 误区 3:变量名叫 `age`,它就永远是年龄?

变量名只是标签,装什么、怎么用是代码决定的。age = -1 编译器也不拦你——所以 2.1 说的"见名知义"是给人看的信用,不是机器的约束。

⚠️ 误区 4:`int x = 3.5;` 没问题吧?

报错:不兼容的类型。int 格子装不下小数——截断都不行,Java 不肯静默丢数据。装小数要用 double(2.3 八大类型的主角之一)。

⚠️ 误区 5:变量定义在 main 里,其他方法也能用?

不能。作用域只看花括号——main 里的变量出了 main 就失效。想让多个方法共享,要么传参(第四章),要么定义在类层面(第五章"成员变量")。


7. 本节自测

❓ Q1:变量三要素是什么?各自相当于格子的什么?

数据类型(格子多大、装什么)、变量名(格子上的标签)、变量值(格子里的内容,可换)。类型声明时定死,值可随时重新赋。

❓ Q2:`age = age + 1;` 执行过程分几步?

两步:① 取出 age 格子里的当前值,加 1;② 把结果重新装回 age 格子。数学上不成立,程序里是高频套路。

❓ Q3:下面代码错在哪?
int score;
System.out.println(score);

局部变量未初始化就使用——编译报错"可能尚未初始化"。Java 不给局部变量默认值,必须先赋值再用。

❓ Q4:`int age = 18;` 之后执行 `age = "十八";` 会怎样?

编译报错:不兼容的类型。变量的类型声明后不可换,int 格子只能装同类型(整数)的值。"十八"是字符串,装不进 int 格子。

❓ Q5:在 main 的花括号里定义的 `age`,能在另一个方法里用吗?

不能。作用域限定在定义它的那对花括号内,出了 main 标签失效。跨方法共享靠传参(第四章)或类级别变量(第五章)。


8. 下一步学什么


9. 相关笔记

Java基础 #Java编程基础 #变量 #赋值 #作用域 #第二章