- 0
- 394 words
从 HelloWorld 到真正写出有用的程序,你遇到的第一个岔路口就是:数据怎么存,变量怎么用。类型声明、赋值、命名规范,这些看似基础的东西,恰恰是写出整洁代码的起点——很多老手踩过的坑,源头都在这里。
一、变量:内存中的”便签盒”
如果把计算机内存想象成一个巨大的储物柜,变量就是柜门上贴了标签的盒子——标签是变量名,盒子里装的是数据。你可以打开盒子看里面的数据,也可以换掉它。
创建一个变量需要两步:
- 声明:告诉 Java 这个变量叫什么名字、装什么类型的数据
- 赋值:往盒子里放数据
// 声明一个整型变量 age
int age;
// 给 age 赋值
age = 25;
// 也可以在声明的同时直接赋值(初始化)
int score = 88;
变量命名规则(记牢,编译期会检查):
- 只能包含:字母、数字、下划线
_、美元符号$ - 不能以数字开头
- 不能是 Java 关键字(如
int、class、public) - 大小写敏感(
age和Age是两个不同的变量) - 驼峰命名法:首字母小写,后面每个单词首字母大写,如
studentName、totalScore
二、Java 的 8 种基本数据类型
Java 的数据类型分两大类:基本类型(primitive types)和引用类型(reference types)。先看基本类型,共 8 种:
2.1 整数类型(4 种)
| 类型 | 占用 | 取值范围 | 默认值 |
|---|---|---|---|
byte | 1 字节 | -128 ~ 127 | 0 |
short | 2 字节 | -32,768 ~ 32,767 | 0 |
int | 4 字节 | -2³¹ ~ 2³¹-1(约 ±21亿) | 0 |
long | 8 字节 | -2⁶³ ~ 2⁶³-1 | 0L |
byte b = 100; // byte:省内存,常用于文件流、网络传输
short s = 20000; // short:不太常用
int count = 999999; // int:日常最常用!
long big = 3000000000L; // long:注意数字末尾加 L(大小写都行,推荐大写避免混淆)
面试高频题:
long big = 3000000000; // 编译报错!数字 3000000000 超过了 int 范围
long big2 = 3000000000L; // ✅ 正确,加 L 告诉编译器这是 long 字面量
2.2 浮点类型(2 种)
| 类型 | 占用 | 精度 | 默认值 |
|---|---|---|---|
float | 4 字节 | 约 6-7 位有效数字 | 0.0f |
double | 8 字节 | 约 15 位有效数字 | 0.0d |
float pi = 3.1415f; // float:末尾必须加 f
double salary = 12800.50; // double:默认的小数类型,日常最常用
⚠️ 注意:浮点数不适合做精确计算(比如金额),因为存在精度丢失问题。0.1 + 0.2 不等于 0.3,这在 Java 和几乎所有编程语言中都一样。金额计算请用 BigDecimal,后面会讲到。
附:字面量与标识符
字面量(Literal)
字面量就是直接写在代码中的”值”。你写的 int age = 25; 里,25 就是一个整数字面量。Java 中常见的字面量类型:
| 类型 | 示例 | 说明 |
|---|---|---|
| 整数字面量 | 42、0xFF、0b1010、077 | 十进制、十六进制(0x)、二进制(0b)、八进制(0) |
| 浮点字面量 | 3.14、1.5e10、2.5f | 默认 double,加 f 为 float |
| 字符字面量 | A、
、u0041 | 单引号括起来,支持转义和 Unicode |
| 布尔字面量 | true、false | 只有俩值 |
| 字符串字面量 | "Hello"、"Java" | 双引号括起来,String 类型 |
| null 字面量 | null | 引用类型的”空”值 |
Java 7+ 的数值分隔符:可以用下划线分隔长数字,提高可读性,编译器会自动忽略。
int million = 1_000_000; // 一百万,一眼就看出来了
long creditCard = 1234_5678_9012_3456L;
float pi = 3.1415_9265F;
Java 17 的文本块(Text Block):多行字符串可以直接用 """ """ 包裹,不用每行末尾拼 n。
String sql = """
SELECT id, name, age
FROM students
WHERE age > 18
ORDER BY age DESC
""";
标识符(Identifier)
标识符就是程序里各种元素的名字——类名、方法名、变量名、接口名统统算。变量命名规则上面说过了,补充一条整体规范:
- 类名/接口名:大驼峰(PascalCase),如
HelloWorld、StudentManager - 方法名/变量名:小驼峰(camelCase),如
getAge()、studentName - 常量名:全大写下划线,如
MAX_VALUE、DB_URL - 包名:全小写点分隔,如
com.example.demo
这都是约定俗成的规范,不遵守编译不会报错,但会被同行骂(笑)。
2.3 字符类型(1 种)
char c1 = 'A'; // 单个字符,用单引号
char c2 = '中'; // Java 的 char 是 Unicode 编码,支持中文
char c3 = 65; // 也可以用 ASCII 码赋值,65 对应 'A'
char 占用 2 字节,可以存储任何 Unicode 字符。但注意:它是基本类型,不是字符串,只能用单引号括一个字符。
2.4 布尔类型(1 种)
boolean isDone = true; // 只有两个值:true / false
boolean isActive = false;
布尔类型在流程控制(if、while、for)中无处不在。Java 的 boolean 不能像 C 语言那样用 0 或 1 替代,必须用 true / false 字面量。
三、类型转换
3.1 自动类型转换(隐式转换)
小范围类型 → 大范围类型,Java 自动帮你转:
int num = 100;
long bigNum = num; // int → long,自动转换 ✅
double d = bigNum; // long → double,自动转换 ✅
// 转换链条:byte → short → int → long → float → double
// ↑
// char —— 向上同样可以
3.2 强制类型转换(显式转换)
大范围 → 小范围,可能丢失精度,必须程序员手动强转:
double pi = 3.14159;
int intPi = (int) pi; // 强制转换,结果为 3(小数部分被截断!)
int big = 128;
byte small = (byte) big; // 超出 byte 范围(-128~127),溢出!结果为 -128
// 溢出的本质:高位被截断了,只保留低 8 位
// 128 的二进制是 00000000 00000000 00000000 10000000
// 强转为 byte 后只剩 10000000(补码),即 -128
新手最容易翻的车:
// 两个 int 相除,结果还是 int(小数被截了)
int a = 5;
int b = 2;
double result = a / b; // 你以为结果是 2.5,其实是 2.0!
System.out.println(result); // 输出 2.0
// 正确做法:先转 double
double result2 = (double) a / b; // 2.5 ✅
double result3 = a * 1.0 / b; // 2.5 ✅
四、引用类型初探
基本类型存的是”值本身”,引用类型存的是”指向对象的地址”。最常见的引用类型就是 String(字符串):
String name = "世杰";
String greeting = "Hello, " + name; // 字符串拼接用 +
System.out.println(greeting); // Hello, 世杰
// 区别:基本类型用 == 比较值,引用类型用 .equals() 比较内容
int a = 10;
int b = 10;
System.out.println(a == b); // true(比较值)
String s1 = new String("Java");
String s2 = new String("Java");
System.out.println(s1 == s2); // false(比较的是内存地址,不是内容)
System.out.println(s1.equals(s2)); // true(比较内容)
关于 String 的细节非常多(常量池、不可变性、StringBuilder 等),后面会专门开一篇讲。现在只需要记住:比较字符串用 equals,别用 ==。
五、常量与 final
如果某个值在程序运行期间不会改变,用 final 关键字声明为常量:
final double PI = 3.14159;
final int MAX_LOGIN_ATTEMPTS = 5;
// PI = 3.14; // ❌ 编译报错!常量不能重新赋值
常量命名规范:全大写字母 + 下划线,一目了然。用常量的好处是:
- 代码可读性更好(
MAX_LOGIN_ATTEMPTS比5含义明确得多) - 修改方便:改一个地方,所有引用都更新
- 防止魔法数字(magic number)散落在代码各处
六、键盘录入:让程序跟人说话
到现在我们写的代码都是”自娱自乐”——变量值写在代码里,写好就定了。怎么让程序真正跟用户交互?键盘录入走起。
Java 提供了 Scanner 类来读取用户输入,它在 java.util 包下面。三步走:
- 导包:
import java.util.Scanner; - 创建对象:
Scanner sc = new Scanner(System.in); - 读取输入:
sc.nextInt()、sc.nextDouble()、sc.nextLine()等
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入你的名字:");
String name = sc.nextLine();
System.out.print("请输入你的年龄:");
int age = sc.nextInt();
System.out.println("你好," + name + "!你今年" + age + "岁了。");
sc.close(); // 用完关掉,好习惯
}
}
运行后控制台会等你输入,输完按回车,程序才会继续往下走——终于不再是”自娱自乐”了。
常见的 Scanner 方法
| 方法 | 返回值 | 说明 |
|---|---|---|
nextInt() | int | 读取一个整数 |
nextDouble() | double | 读取一个小数 |
next() | String | 读取一个单词(遇到空格停) |
nextLine() | String | 读取一整行(包括空格) |
nextBoolean() | boolean | 读取 true 或 false |
⚠️ 小陷阱:nextInt() 后接 nextLine() 会出现”吞回车”问题。因为 nextInt() 只读取数字不读取后面的换行符,紧接着 nextLine() 就读到了这个空行。解决方案是在两者之间加一个 sc.nextLine() 把换行符吃掉。
System.out.print("请输入年龄:");
int age = sc.nextInt();
sc.nextLine(); // 👈 吃掉换行符
System.out.print("请输入姓名:");
String name = sc.nextLine(); // 这回正常了
这个坑学 Java 的人几乎都踩过,你也迟早会踩到,提前知道不吃亏。
结语
今天我们把 Java 的 8 种基本数据类型挨个捋了一遍,搞清了变量的声明、赋值、命名规范,还知道了类型转换什么时候会自动发生、什么时候会溢出。最后用一个 String 示例引入了引用类型的概念,也提醒了你那个 equals 和 == 的选择题——面试里这个坑几乎必考。
下一篇我们继续深入基础语法,看看运算符、表达式和流程控制——if、for、while 这些你写每行代码都离不开的东西,到底有哪些值得注意的细节。