上一篇我们完成了Java开发环境的搭建,成功运行了第一个Hello World程序,迈出了Java学习的第一步。从本篇开始,我们正式进入Java基础语法的学习------变量、数据类型与运算符,是Java代码的"基石",所有复杂的程序逻辑,本质上都是通过变量存储数据、通过运算符处理数据实现的。

很多新手在这一步容易混淆"基本数据类型的区别""类型转换的规则""运算符的优先级",甚至写出语法错误的代码。本篇文章将从原理入手,结合实战案例,手把手教你掌握变量的定义与使用、8种基本数据类型的细节、类型转换的技巧,以及常见运算符的用法,同时拆解新手高频易错点,让你吃透基础语法,为后续学习流程控制、数组等内容筑牢根基。
核心目标:掌握变量的定义与命名规范,理解8种基本数据类型的范围与用途,能熟练进行类型转换,灵活使用各类运算符编写简单计算逻辑,规避基础语法错误。
一、前置认知:什么是变量?为什么需要变量?
在Java中,变量就像一个"容器",用于存储程序运行过程中需要用到的数据(比如数字、文字、布尔值等)。我们可以把变量理解为生活中的"抽屉",抽屉里可以放不同类型的物品(对应不同类型的数据),我们可以随时查看、修改抽屉里的物品(对应变量的赋值与使用)。
举个例子:我们要编写一个"计算两个数的和"的程序,需要存储两个待计算的数字(比如3和5),以及计算后的结果(8),这时候就需要用到变量------用变量存储3、5和8,后续如果需要修改数字,直接修改变量的值即可,无需修改整个计算逻辑,极大提升了代码的灵活性和可维护性。
核心结论:变量是程序中数据的载体,没有变量,就无法存储和处理数据,也就无法实现复杂的程序逻辑。
二、变量的定义与命名规范(新手必守,避免语法错误)
2.1 变量的定义格式(固定写法)
Java是一门"强类型语言",意味着 每一个变量都必须明确指定数据类型,才能存储对应类型的数据。变量的定义格式如下:
java
数据类型 变量名 = 初始值; // 完整格式:声明类型+变量名+赋值
// 示例
int age = 18; // 定义一个int类型的变量,变量名是age,初始值是18
String name = "Java学习者"; // 定义一个String类型的变量,变量名是name,初始值是字符串
补充说明:
-
"数据类型":决定了变量能存储什么类型的数据(比如int只能存整数,double能存小数);
-
"变量名":给变量起的名字,用于区分不同的变量(比如age存储年龄,name存储姓名);
-
"初始值":可选,变量可以先声明、后赋值,但使用变量前必须赋值(否则会报错);
-
分号";":Java语句的结束标志,必须加上,否则会报语法错误(新手最易遗漏)。
错误示例(新手常犯):
java
age = 18; // 错误:未声明数据类型,Java不知道age是什么类型的变量
int age; // 声明变量但未赋值,后续直接使用age会报错
int 1age = 18; // 错误:变量名不符合命名规范
2.2 变量的命名规范(重中之重,规范编码)
变量命名不仅要符合Java语法规则,还要遵循行业规范,这样写出的代码才清晰易懂,方便自己和他人阅读。核心规范如下(记牢,避免踩坑):
-
只能由字母(A-Z、a-z)、数字(0-9)、下划线(_)、美元符号($)组成,不能以数字开头(如1age、2name都是错误的);
-
不能使用Java的"关键字"(Java中具有特殊含义的单词,如int、class、if等),比如不能定义"int int = 10;";
-
区分大小写(Java是大小写敏感的),比如age和Age是两个不同的变量(建议统一小写开头,避免混淆);
-
采用"驼峰命名法":首字母小写,后面每个单词的首字母大写(贴合行业习惯,可读性强),比如userName、studentAge、phoneNumber;
-
变量名要"见名知意",避免使用a、b、c等无意义的名字(比如用age表示年龄,不用x表示年龄)。
正确示例:int studentAge = 20; String userName = "张三"; double mathScore = 98.5;
错误示例:int 1score = 90;(以数字开头)、String class = "一班";(使用关键字class)、int x = 18;(见名不知意)。
2.3 变量的使用场景(实战演示)
结合上一篇的IDEA环境,我们编写一个简单的程序,演示变量的声明、赋值与使用:
java
public class VariableDemo {
public static void main(String[] args) {
// 1. 声明并赋值变量
String userName = "Java学习者";
int age = 18;
double height = 175.5; // 身高,单位cm
boolean isStudent = true; // 是否是学生,true表示是,false表示否
// 2. 使用变量:打印变量的值
System.out.println("姓名:" + userName);
System.out.println("年龄:" + age);
System.out.println("身高:" + height + "cm");
System.out.println("是否是学生:" + isStudent);
// 3. 修改变量的值
age = 19; // 将age的值从18修改为19
height = 176.0; // 将height的值从175.5修改为176.0
System.out.println("修改后的年龄:" + age);
System.out.println("修改后的身高:" + height + "cm");
}
}
运行结果:
java
姓名:Java学习者
年龄:18
身高:175.5cm
是否是学生:true
修改后的年龄:19
修改后的身高:176.0cm
说明:变量的值可以随时修改,修改后会覆盖原来的值;使用"+"符号可以将变量与字符串拼接,实现打印效果(后续会详细讲解字符串拼接)。
三、Java 8种基本数据类型(核心重点,必吃透)
Java中的数据类型分为两大类:基本数据类型和引用数据类型。本篇重点讲解8种基本数据类型(引用数据类型如String、数组等,后续章节讲解),这8种类型是Java基础的基础,直接决定了变量能存储的数据类型和范围。
8种基本数据类型分为4大类:整数类型、浮点类型、字符类型、布尔类型,具体如下表所示(建议收藏,方便后续查阅):
| 数据类型分类 | 具体类型 | 关键字 | 占用内存 | 取值范围 | 用途说明 |
|---|---|---|---|---|---|
| 整数类型(存储整数) | 字节型 | byte | 1字节 | -128 ~ 127 | 存储范围小的整数,节省内存(如存储年龄、状态码) |
| 整数类型(存储整数) | 短整型 | short | 2字节 | -32768 ~ 32767 | 存储中等范围的整数(较少使用) |
| 整数类型(存储整数) | 整型 | int | 4字节 | -2^31 ~ 2^31 - 1(约-21亿 ~ 21亿) | 最常用,存储普通整数(如年龄、分数、数量) |
| 整数类型(存储整数) | 长整型 | long | 8字节 | -2^63 ~ 2^63 - 1(范围极大) | 存储大范围整数(如时间戳、身份证号) |
| 浮点类型(存储小数) | 单精度浮点型 | float | 4字节 | 约±3.4×10^38(精度较低) | 存储精度要求不高的小数(较少使用) |
| 浮点类型(存储小数) | 双精度浮点型 | double | 8字节 | 约±1.8×10^308(精度较高) | 最常用,存储小数(如身高、体重、分数) |
| 字符类型(存储单个字符) | 字符型 | char | 2字节 | 0 ~ 65535(Unicode编码) | 存储单个字符(如'a'、'中'、'1') |
| 布尔类型(存储真假) | 布尔型 | boolean | 1字节(或更少,由JVM决定) | true(真)、false(假) | 存储判断结果(如是否登录、是否及格) |
3.1 各类型详细讲解(结合实战,避坑)
(1)整数类型:重点掌握int和long
-
int:最常用,默认的整数类型。比如"int num = 100;",无需额外标识,直接赋值即可;
-
long:存储范围比int大,赋值时必须在数字末尾加L(或l)(区分int和long,否则会报错),比如"long bigNum = 10000000000L;"(如果不加L,数字超过int范围会报错);
-
byte和short:使用较少,仅在需要节省内存时使用(比如存储大量的状态码),赋值时注意不要超出取值范围(比如byte num = 128; 会报错,因为byte的最大值是127)。
避坑点1:long类型赋值必须加L,小写l容易和数字1混淆,建议用大写L;
避坑点2:整数的默认类型是int,当数字超过int的取值范围时,必须用long类型,否则会报"整数太大"错误。
java
// 正确示例
int num1 = 1000;
long num2 = 10000000000L; // 加L标识为long类型
byte num3 = 127; // 不超过byte的取值范围
// 错误示例
long num4 = 10000000000; // 错误:未加L,默认是int类型,数字超出int范围
byte num5 = 128; // 错误:byte的最大值是127,超出范围
(2)浮点类型:重点掌握double,注意精度问题
-
double:最常用,默认的浮点类型。比如"double score = 98.5;",无需额外标识;
-
float:赋值时必须在小数末尾加F(或f),比如"float weight = 65.5F;"(不加F,默认是double类型,无法赋值给float变量);
-
核心坑:浮点类型(float、double)存在精度误差,不能用于精确计算(比如金钱计算),后续会讲解解决方案(使用BigDecimal类)。
精度误差演示(新手必看):
java
public class FloatDemo {
public static void main(String[] args) {
double a = 0.1;
double b = 0.2;
System.out.println(a + b); // 预期输出0.3,实际输出0.30000000000000004
}
}
原因:计算机存储浮点数时,是按照二进制存储的,0.1和0.2无法被二进制精确表示,因此会产生微小的精度误差。解决方案:暂时记住这个坑,后续学习引用类型时,会讲解如何用BigDecimal解决精确计算问题。
(3)字符类型char:存储单个字符
char类型的赋值有3种方式,重点掌握前2种:
java
public class CharDemo {
public static void main(String[] args) {
// 方式1:单引号包裹单个字符(最常用)
char c1 = 'a'; // 字母
char c2 = '中'; // 中文(Unicode编码支持中文)
char c3 = '1'; // 数字字符(注意:是字符'1',不是整数1)
// 方式2:使用Unicode编码赋值(了解即可)
char c4 = '\u0061'; // Unicode编码,对应字符'a'
// 方式3:使用整数赋值(了解即可,对应Unicode编码值)
char c5 = 97; // 97对应Unicode编码的'a'
System.out.println(c1); // 输出a
System.out.println(c2); // 输出中
System.out.println(c3); // 输出1
System.out.println(c4); // 输出a
System.out.println(c5); // 输出a
}
}
避坑点3:char类型必须用单引号包裹,且只能包裹单个字符(比如char c = "a"; 错误,双引号是字符串;char c = 'ab'; 错误,包裹了两个字符)。
(4)布尔类型boolean:仅存储true和false
boolean类型非常简单,只有两个取值:true(真)和false(假),常用于判断条件(比如"是否及格""是否登录成功")。
java
public class BooleanDemo {
public static void main(String[] args) {
boolean isPass = true; // 及格
boolean isLogin = false; // 未登录
// 简单判断
if (isPass) {
System.out.println("考试及格!");
} else {
System.out.println("考试不及格!");
}
}
}
避坑点4:boolean类型不能用0或1代替true或false(和其他语言不同,比如C语言中0表示假,1表示真),只能直接写true或false。
3.2 基本数据类型的默认值(了解,后续有用)
如果变量声明在类中(成员变量),没有手动赋值,Java会自动给变量赋默认值;如果变量声明在方法中(局部变量),没有赋值则无法使用(必须手动赋值)。默认值如下:
-
整数类型(byte、short、int、long):默认值0;
-
浮点类型(float、double):默认值0.0;
-
字符类型(char):默认值'\u0000'(空字符,不可见);
-
布尔类型(boolean):默认值false。
四、类型转换:自动转换与强制转换(高频考点)
在Java中,不同数据类型的变量之间可以相互转换,但必须遵循一定的规则,否则会报错。类型转换分为两种:自动类型转换(隐式转换)和强制类型转换(显式转换)。
4.1 自动类型转换(无需手动操作,Java自动完成)
核心规则:范围小的数据类型 → 范围大的数据类型(就像"小杯子的水倒入大杯子,不会溢出"),Java会自动完成转换,无需额外操作。
常见的自动转换顺序(从范围小到范围大):
byte → short → int → long → float → double
char类型比较特殊,会自动转换为int类型(因为char的Unicode编码值是整数)。
实战演示:
java
public class AutoConvertDemo {
public static void main(String[] args) {
// 1. byte → int(范围小→范围大,自动转换)
byte b = 10;
int i = b; // 自动转换,无需手动操作
System.out.println(i); // 输出10
// 2. int → long(范围小→范围大,自动转换)
int num1 = 100;
long num2 = num1; // 自动转换
System.out.println(num2); // 输出100
// 3. int → double(范围小→范围大,自动转换)
int num3 = 5;
double num4 = num3; // 自动转换
System.out.println(num4); // 输出5.0(自动转为小数)
// 4. char → int(自动转换,对应Unicode编码)
char c = 'a';
int num5 = c;
System.out.println(num5); // 输出97('a'的Unicode编码值)
}
}
4.2 强制类型转换(需要手动操作,注意溢出)
核心规则:范围大的数据类型 → 范围小的数据类型(就像"大杯子的水倒入小杯子,可能会溢出"),Java不会自动转换,必须手动添加强制转换符号,格式如下:
java
目标数据类型 变量名 = (目标数据类型) 源变量;
// 示例
double d = 98.5;
int i = (int) d; // 强制将double类型转为int类型
实战演示:
java
public class ForceConvertDemo {
public static void main(String[] args) {
// 1. double → int(范围大→范围小,强制转换)
double score = 98.5;
int intScore = (int) score; // 强制转换,会丢失小数部分(不是四舍五入)
System.out.println(intScore); // 输出98(不是99)
// 2. long → int(范围大→范围小,强制转换)
long bigNum = 1000000;
int smallNum = (int) bigNum; // 数字未超出int范围,转换成功
System.out.println(smallNum); // 输出1000000
// 3. 溢出案例(重点避坑)
long tooBigNum = 2147483648L; // int的最大值是2147483647,这个数字超出int范围
int overflowNum = (int) tooBigNum;
System.out.println(overflowNum); // 输出-2147483648(溢出,数据错乱)
}
}
避坑点5:强制转换会丢失精度(浮点转整数丢失小数部分)或导致数据溢出(范围大的整数转范围小的整数,超出范围会导致数据错乱),一定要谨慎使用;
避坑点6:boolean类型不能和任何其他数据类型相互转换(比如不能将true转为int,也不能将int转为boolean)。
五、运算符:Java中处理数据的"工具"
运算符用于对变量或常量进行运算(比如加减乘除、比较大小、逻辑判断等)。Java中的运算符分为5大类,重点掌握前4类,新手先吃透基础用法,后续结合流程控制灵活运用。
5.1 算术运算符(最常用,用于计算)
用于进行加减乘除、取余等算术运算,常见算术运算符如下:
| 运算符 | 作用 | 示例 | 结果 |
|---|---|---|---|
| + | 加法运算;字符串拼接 | 3 + 5;"Hello" + "Java" | 8;"HelloJava" |
| - | 减法运算 | 10 - 4 | 6 |
| * | 乘法运算 | 3 * 6 | 18 |
| / | 除法运算(整数除法会丢失小数) | 10 / 3;10.0 / 3 | 3;3.333... |
| % | 取余运算(求余数) | 10 % 3;7 % 2 | 1;1 |
| ++ | 自增(变量值+1) | int a=3; a++; | a=4 |
| -- | 自减(变量值-1) | int b=5; b--; | b=4 |
重点避坑(新手高频错误):
-
整数除法:两个整数相除,结果还是整数,会丢失小数部分(不是四舍五入),比如10/3=3,不是3.333;如果想要得到小数结果,需要将其中一个数转为浮点类型,比如10.0/3;
-
自增(++)和自减(--):分为前缀和后缀,前缀(++a)是先自增再使用,后缀(a++)是先使用再自增,示例如下:
java
public class ArithmeticDemo {
public static void main(String[] args) {
// 整数除法坑
System.out.println(10 / 3); // 输出3(丢失小数)
System.out.println(10.0 / 3); // 输出3.3333333333333335
// 自增前缀和后缀区别
int a = 3;
int b = ++a; // 前缀:先自增(a变成4),再赋值给b,b=4
System.out.println(a); // 4
System.out.println(b); // 4
int c = 3;
int d = c++; // 后缀:先赋值给d(d=3),再自增(c变成4)
System.out.println(c); // 4
System.out.println(d); // 3
}
}
补充:"+"运算符除了用于加法,还能用于字符串拼接,只要有一个操作数是字符串,另一个操作数会自动转为字符串,比如"年龄:" + 18 → "年龄:18"。
5.2 关系运算符(用于判断,返回boolean值)
用于比较两个变量或常量的大小关系,结果只有true(成立)或false(不成立),常用于后续的if、while等流程控制语句。
| 运算符 | 作用 | 示例 | 结果 |
|---|---|---|---|
| == | 判断两个值是否相等(注意:不是赋值) | 3 == 5;"a" == "a" | false;true |
| != | 判断两个值是否不相等 | 3 != 5 | true |
| > | 判断左边是否大于右边 | 10 > 5 | true |
| < | 判断左边是否小于右边 | 10 < 5 | false |
| >= | 判断左边是否大于等于右边 | 5 >= 5 | true |
| <= | 判断左边是否小于等于右边 | 3 <= 5 | true |
避坑点7:"=="是判断相等,"="是赋值,新手容易混淆,比如"if (a == 5)"是判断a是否等于5,"a = 5"是将5赋值给a,写错会导致逻辑错误。
5.3 逻辑运算符(用于逻辑判断,返回boolean值)
用于连接多个关系判断,进行复杂的逻辑运算,常见的有3种,重点掌握短路特性:
| 运算符 | 作用(逻辑关系) | 短路特性 | 示例 | 结果 |
|---|---|---|---|---|
| & | 逻辑与(同时成立才为true) | 左边为false,右边不执行 | 3>5 && 4>2 | false |
| || | 逻辑或(有一个成立就为true) | 左边为true,右边不执行 | 3>5 || 4>2 | true |
| ! | 逻辑非(取反,true变false,false变true) | 无 | !(3>5) | true |
短路特性演示(重点,提升代码效率):
java
public class LogicDemo {
public static void main(String[] args) {
// 逻辑与&&:左边为false,右边不执行
int a = 3;
boolean b = (a > 5) && (++a > 3);
System.out.println(b); // false(左边a>5为false,右边++a不执行)
System.out.println(a); // 3(a没有自增)
// 逻辑或||:左边为true,右边不执行
int c = 3;
boolean d = (c < 5) || (++c > 3);
System.out.println(d); // true(左边c<5为true,右边++c不执行)
System.out.println(c); // 3(c没有自增)
}
}
应用场景:逻辑运算符常用于多条件判断,比如"判断一个数是否在10到20之间",可以写成"num > 10 && num < 20"。
5.4 赋值运算符(用于赋值,简化代码)
用于给变量赋值,除了基本的"=",还有复合赋值运算符(简化算术运算+赋值的操作),常用如下:
| 运算符 | 简化写法 | 等价写法 |
|---|---|---|
| = | a = 5 | a = 5 |
| += | a += 3 | a = a + 3 |
| -= | a -= 3 | a = a - 3 |
| *= | a *= 3 | a = a * 3 |
| /= | a /= 3 | a = a / 3 |
| %= | a %= 3 | a = a % 3 |
实战演示:
java
public class AssignDemo {
public static void main(String[] args) {
int a = 5;
a += 3; // 等价于a = a + 3
System.out.println(a); // 8
a -= 2; // 等价于a = a - 2
System.out.println(a); // 6
a *= 4; // 等价于a = a * 4
System.out.println(a); // 24
}
}
5.5 运算符优先级(了解,无需死记硬背)
当一个表达式中有多个运算符时,Java会按照"优先级"依次执行,就像数学中的"先乘除后加减"。重点记住3个优先级:
-
算术运算符 > 关系运算符 > 逻辑运算符;
-
可以用括号"()"改变优先级,括号内的表达式优先执行;
-
赋值运算符优先级最低,最后执行。
示例:
java
// 先算乘法3*4=12,再算加法5+12=17,最后赋值给a
int a = 5 + 3 * 4;
System.out.println(a); // 17
// 用括号改变优先级,先算5+3=8,再算8*4=32
int b = (5 + 3) * 4;
System.out.println(b); // 32
六、实战:编写一个简单的计算器程序
结合本篇所学的变量、数据类型与运算符,编写一个简单的计算器程序,实现"两个数的加减乘除、取余"功能,巩固所学知识点:
java
import java.util.Scanner; // 导入Scanner类,用于获取用户输入
public class CalculatorDemo {
public static void main(String[] args) {
// 1. 定义变量,存储两个操作数和运算结果
double num1;
double num2;
double result;
// 2. 获取用户输入的两个数
Scanner scanner = new Scanner(System.in); // 创建Scanner对象
System.out.print("请输入第一个数字:");
num1 = scanner.nextDouble(); // 获取用户输入的第一个小数
System.out.print("请输入第二个数字:");
num2 = scanner.nextDouble(); // 获取用户输入的第二个小数
// 3. 进行加减乘除、取余运算
result = num1 + num2;
System.out.println(num1 + " + " + num2 + " = " + result);
result = num1 - num2;
System.out.println(num1 + " - " + num2 + " = " + result);
result = num1 * num2;
System.out.println(num1 + " * " + num2 + " = " + result);
// 避免除数为0的错误
if (num2 != 0) {
result = num1 / num2;
System.out.println(num1 + " / " + num2 + " = " + result);
result = num1 % num2;
System.out.println(num1 + " % " + num2 + " = " + result);
} else {
System.out.println("错误:除数不能为0!");
}
scanner.close(); // 关闭Scanner对象,释放资源
}
}
运行效果:
java
请输入第一个数字:10
请输入第二个数字:3
10.0 + 3.0 = 13.0
10.0 - 3.0 = 7.0
10.0 * 3.0 = 30.0
10.0 / 3.0 = 3.3333333333333335
10.0 % 3.0 = 1.0
说明:该程序使用了Scanner类获取用户输入(后续会详细讲解),同时加入了"除数不能为0"的判断,避免程序报错,体现了代码的严谨性。
七、新手高频易错点总结(必看,避坑指南)
-
变量未声明数据类型、未赋值就使用,或变量名不符合命名规范;
-
long类型赋值未加L,float类型赋值未加F,导致语法错误;
-
char类型用双引号包裹,或包裹多个字符;
-
浮点类型用于精确计算,忽略精度误差;
-
强制类型转换时,未注意数据溢出或精度丢失;
-
混淆"=="(判断相等)和"="(赋值);
-
整数除法时,忽略"丢失小数部分"的问题;
-
自增/自减的前缀和后缀用法混淆,导致逻辑错误。
八、总结与下期预告
本篇文章重点讲解了Java基础语法的核心------变量、8种基本数据类型、类型转换和运算符,这些知识点是编写所有Java程序的基础,必须熟练掌握。我们通过原理讲解+实战案例,拆解了新手最易混淆的点和易错点,尤其是基本数据类型的范围、类型转换的规则、运算符的短路特性,一定要多动手练习,加深记忆。
动手练习建议:修改本篇的计算器程序,增加"判断两个数的大小""计算三个数的平均值"等功能,巩固变量、数据类型和运算符的用法。