2.2 Java中的变量
变量 = 给内存里的一个格子贴上标签:标签是变量名,格子大小由数据类型定,里面装着可以随时换的值。程序从这一节起学会"记住东西"。三条使用铁律:先声明再使用、类型不能换、局部变量必须先赋值再用。
变量是编程的第一块砖——后面所有章节(数组、对象、方法传参)全建立在它上面。好在这节不抽象:一句话"给内存格子贴标签",剩下的全是规矩和练习。
1. 变量是什么(用大白话说透)
回忆1.4:程序运行时,数据都住在内存里。内存可以理解成一排格子(1.2 篇讲过 1 Byte = 8 bit 的老地基)。
变量 = 一个格子 + 一张标签:
- 数据类型——决定格子多大、能装什么(
int的格子装整数,装不下小数) - 变量名——标签,以后想用这个格子,喊标签名就行,不用背"第几号格子"
- 变量值——格子里装的内容,可以随时换(这就是"变"量)
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
}
}
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. 三条使用铁律
Java 是从上往下逐句执行的。用到某个变量时,它的定义行必须在前面已经出现过。没声明就用 → 找不到符号。
int age = 18; 之后 age = "十八"; → 报错:不兼容的类型。值可以换,换的必须是同类型的值(类型之间怎么"转换",2.x 后面专讲)。
int n; System.out.println(n); → 编译报错:可能尚未初始化。1.4 说过局部变量住栈区、随方法结束自动清——Java 不给它默认值,逼你先赋值再用,防止用到脏数据。
6. 常见误区
不对,= 是赋值号:把右边的值装进左边的格子。数学的"等于"以后用 == 表达。从这节起养成新读法。
不行,同一作用域内标签不能重名——一格一标签,两个标签指一个格子会打架。报错:已在方法中定义了变量 age。不同层花括号里可以同名(第三章讲流程控制时会撞见)。
变量名只是标签,装什么、怎么用是代码决定的。age = -1 编译器也不拦你——所以 2.1 说的"见名知义"是给人看的信用,不是机器的约束。
报错:不兼容的类型。int 格子装不下小数——截断都不行,Java 不肯静默丢数据。装小数要用 double(2.3 八大类型的主角之一)。
不能。作用域只看花括号——main 里的变量出了 main 就失效。想让多个方法共享,要么传参(第四章),要么定义在类层面(第五章"成员变量")。
7. 本节自测
数据类型(格子多大、装什么)、变量名(格子上的标签)、变量值(格子里的内容,可换)。类型声明时定死,值可随时重新赋。
两步:① 取出 age 格子里的当前值,加 1;② 把结果重新装回 age 格子。数学上不成立,程序里是高频套路。
int score;
System.out.println(score);
局部变量未初始化就使用——编译报错"可能尚未初始化"。Java 不给局部变量默认值,必须先赋值再用。
编译报错:不兼容的类型。变量的类型声明后不可换,int 格子只能装同类型(整数)的值。"十八"是字符串,装不进 int 格子。
不能。作用域限定在定义它的那对花括号内,出了 main 标签失效。跨方法共享靠传参(第四章)或类级别变量(第五章)。
8. 下一步学什么
- ☐ 2.3 Java中的运算符 ——
=和==的正面较量、整数除法为什么砍小数、b += 1为什么能过而b = b + 1报错 - ☐ 动手作业在
I:\JavaCode\IDEA02项目里新建Demo02、Demo03跑通
9. 相关笔记
- 2.1 Java基本语法 ← 上一篇:标识符命名、常量认脸
- 1.4 运行机制 ← 栈区内存,变量的家
- 计算机基础 01 二进制 ← 格子为什么会有大有小
- ☕ Java基础 · 索引
- 🏠 返回主页