×

从 HelloWorld 到真正写出有用的程序,你遇到的第一个岔路口就是:数据怎么存,变量怎么用。类型声明、赋值、命名规范,这些看似基础的东西,恰恰是写出整洁代码的起点——很多老手踩过的坑,源头都在这里。

一、变量:内存中的”便签盒”

如果把计算机内存想象成一个巨大的储物柜,变量就是柜门上贴了标签的盒子——标签是变量名,盒子里装的是数据。你可以打开盒子看里面的数据,也可以换掉它。

创建一个变量需要两步:

  1. 声明:告诉 Java 这个变量叫什么名字、装什么类型的数据
  2. 赋值:往盒子里放数据
// 声明一个整型变量 age
int age;

// 给 age 赋值
age = 25;

// 也可以在声明的同时直接赋值(初始化)
int score = 88;

变量命名规则(记牢,编译期会检查):

  • 只能包含:字母、数字、下划线 _、美元符号 $
  • 不能以数字开头
  • 不能是 Java 关键字(如 intclasspublic
  • 大小写敏感(ageAge 是两个不同的变量)
  • 驼峰命名法:首字母小写,后面每个单词首字母大写,如 studentNametotalScore

二、Java 的 8 种基本数据类型

Java 的数据类型分两大类:基本类型(primitive types)和引用类型(reference types)。先看基本类型,共 8 种:

2.1 整数类型(4 种)

类型占用取值范围默认值
byte1 字节-128 ~ 1270
short2 字节-32,768 ~ 32,7670
int4 字节-2³¹ ~ 2³¹-1(约 ±21亿)0
long8 字节-2⁶³ ~ 2⁶³-10L
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 种)

类型占用精度默认值
float4 字节约 6-7 位有效数字0.0f
double8 字节约 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 中常见的字面量类型:

类型示例说明
整数字面量420xFF0b1010077十进制、十六进制(0x)、二进制(0b)、八进制(0)
浮点字面量3.141.5e102.5f默认 double,加 ffloat
字符字面量A u0041单引号括起来,支持转义和 Unicode
布尔字面量truefalse只有俩值
字符串字面量"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),如 HelloWorldStudentManager
  • 方法名/变量名:小驼峰(camelCase),如 getAge()studentName
  • 常量名:全大写下划线,如 MAX_VALUEDB_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_ATTEMPTS5 含义明确得多)
  • 修改方便:改一个地方,所有引用都更新
  • 防止魔法数字(magic number)散落在代码各处

六、键盘录入:让程序跟人说话

到现在我们写的代码都是”自娱自乐”——变量值写在代码里,写好就定了。怎么让程序真正跟用户交互?键盘录入走起。

Java 提供了 Scanner 类来读取用户输入,它在 java.util 包下面。三步走:

  1. 导包import java.util.Scanner;
  2. 创建对象Scanner sc = new Scanner(System.in);
  3. 读取输入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读取 truefalse

⚠️ 小陷阱: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 这些你写每行代码都离不开的东西,到底有哪些值得注意的细节。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

作者

2248768396@qq.com

相关文章