Java 基本语法详解(一)
Java 是一种面向对象的编程语言,其语法具有严谨性、跨平台性和易读性的特点。掌握基本语法是编写 Java 程序的基础,以下将从程序结构、核心语法要素到常见语法规则,进行系统梳理。
一、Java 程序的基本结构
一个完整的 Java 程序需遵循固定结构,以最简单的 “Hello World” 程序为例,可清晰理解其组成部分:
// 1. 包声明(可选,用于组织代码,避免类名冲突)
package com.example.basic;
// 2. 导入其他包的类(可选,使用非当前包的类时需导入)
import java.util.Scanner;
// 3. 类定义(Java 程序的最小单位,每个 .java 文件最多 1 个 public 类,且类名与文件名一致)
public class HelloWorld {
// 4. 主方法(程序入口,固定格式:public static void main(String[] args))
public static void main(String[] args) {
// 5. 语句(执行具体逻辑,需以分号 ; 结尾)
System.out.println("Hello, Java!"); // 输出语句,打印内容到控制台
}
}
核心结构说明:
-
包声明(package):通过 package 关键字指定类所属的包,格式为 “包名。子包名”(如 com.example.basic),包名通常采用 “倒置域名” 规则(如公司域名 baidu.com 对应包名 com.baidu)。
-
导入语句(import):通过 import 关键字引入其他包中的类(如 java.util.Scanner 是用于输入的类),若使用 java.lang 包下的类(如 String、System),可无需导入(JVM 自动加载)。
-
类定义(class):Java 是 “类级语言”,所有代码必须放在类中。public 修饰的类为 “公共类”,要求文件名与类名完全一致(包括大小写);非 public 类可多个存在于一个 .java 文件中。
-
主方法(main):程序的 “入口点”,JVM 运行程序时会首先执行 main 方法,其格式固定:
-
public:公开访问权限,确保 JVM 可调用;
-
static:静态方法,无需创建类的对象即可调用;
-
void:无返回值;
-
String[] args:参数数组,用于接收命令行传入的参数(如运行 java HelloWorld 123,args[0] 即为 “123”)。
二、变量与数据类型
变量是存储数据的容器,Java 是 “强类型语言”,声明变量时必须指定数据类型,且赋值需与类型匹配。
1. 基本数据类型(8 种,存储原始值)
Java 提供 8 种基本数据类型,分为 “数值型”“字符型”“布尔型” 三类,具体如下:
| 类型分类 | 数据类型 | 占用内存 | 取值范围 | 说明 |
|---|---|---|---|---|
| 整数型 | byte | 1 字节 | -128 ~ 127 | 最小整数类型,适合存储小范围整数 |
| 整数型 | short | 2 字节 | -32768 ~ 32767 | 短整数类型 |
| 整数型 | int | 4 字节 | -2³¹ ~ 2³¹-1 | 默认整数类型(如 123 默认为 int) |
| 整数型 | long | 8 字节 | -2⁶³ ~ 2⁶³-1 | 长整数类型,赋值时需加后缀 L(如 123L) |
| 浮点型 | float | 4 字节 | ±3.4×10³⁸ | 单精度浮点数,赋值时需加后缀 F(如 3.14F) |
| 浮点型 | double | 8 字节 | ±1.8×10³⁰⁸ | 默认浮点类型(如 3.14 默认为 double) |
| 字符型 | char | 2 字节 | 0 ~ 65535 | 存储单个字符,用单引号包裹(如 ‘A’、‘中’),本质是 Unicode 编码值 |
| 布尔型 | boolean | 1 字节 | true / false | 存储逻辑值,用于条件判断(如 boolean isSuccess = true) |
示例:基本数据类型的声明与赋值
public class PrimitiveTypeDemo {
public static void main(String[] args) {
byte age = 25; // 整数型(byte)
int score = 98; // 整数型(int,默认)
long distance = 1000000000L; // 整数型(long,加 L 后缀)
float pi1 = 3.14F; // 浮点型(float,加 F 后缀)
double pi2 = 3.1415926; // 浮点型(double,默认)
char ch = 'J'; // 字符型(单引号)
boolean isPass = true; // 布尔型
// 输出变量值
System.out.println("年龄:" + age);
System.out.println("圆周率(double):" + pi2);
}
}
2. 引用数据类型(存储内存地址,指向对象)
引用数据类型基于基本类型扩展,包括 “类(Class)”“接口(Interface)”“数组(Array)” 等,常见示例:
-
字符串类型:String(特殊的类,用于存储字符串,用双引号包裹,如 “Java”);
-
数组:如 int[] arr(存储多个同类型数据);
-
自定义类:如前面的 HelloWorld 类,需通过 new 关键字创建对象(如 HelloWorld demo = new HelloWorld())。
示例:引用数据类型的使用
public class ReferenceTypeDemo {
public static void main(String[] args) {
// String 类型(引用类型)
String name = "Alice";
System.out.println("姓名:" + name);
// 数组(引用类型)
int[] scores = {90, 85, 95}; // 初始化一个 int 数组
System.out.println("数组长度:" + scores.length); // 数组的 length 属性(获取长度)
System.out.println("第二个元素:" + scores[1]); // 数组下标从 0 开始
// 自定义类(引用类型,需先创建对象)
Student student = new Student(); // new 关键字创建 Student 对象
student.name = "Bob"; // 给对象的属性赋值
student.age = 20;
student.study(); // 调用对象的方法
}
}
// 自定义类(引用类型的定义)
class Student {
// 类的属性(成员变量)
String name;
int age;
// 类的方法(成员方法)
void study() {
System.out.println(name + "正在学习 Java!");
}
}
3. 变量的作用域
变量的作用域指其可被访问的范围,由声明位置决定,主要分为:
-
局部变量:在方法、代码块(如 if、for)内部声明,作用域仅限于当前方法 / 代码块,必须手动初始化后才能使用(否则编译报错);
-
成员变量:在类内部、方法外部声明(如 Student 类的 name、age),作用域覆盖整个类,默认有初始值(如 int 默认为 0,String 默认为 null)。
示例:变量作用域
public class VariableScopeDemo {
// 成员变量(类内部,方法外部)
int memberVar = 100; // 默认初始化
public void test() {
// 局部变量(方法内部)
int localVar;
// System.out.println(localVar); // 编译报错:局部变量未初始化
localVar = 200; // 手动初始化后可使用
System.out.println("局部变量:" + localVar);
System.out.println("成员变量:" + memberVar); // 可访问成员变量
}
public static void main(String[] args) {
VariableScopeDemo demo = new VariableScopeDemo();
demo.test();
// System.out.println(localVar); // 编译报错:局部变量作用域不包含 main 方法
}
}
三、运算符
运算符用于对数据进行运算,Java 提供丰富的运算符,按功能可分为以下几类:
1. 算术运算符(用于数值计算)
| 运算符 | 功能 | 示例 | 结果 |
|---|---|---|---|
| + | 加法 / 字符串拼接 | 3 + 5 / “Hello” + “Java” | 8 / “HelloJava” |
| - | 减法 | 10 - 4 | 6 |
| * | 乘法 | 2 * 6 | 12 |
| / | 除法(整数除法取商,浮点数除法取精确值) | 10 / 3 / 10.0 / 3 | 3 / 3.333… |
| % | 取模(求余数,符号与被除数一致) | 10 % 3 / -10 % 3 | 1 / -1 |
| ++ | 自增(前置:先增后用;后置:先用后增) | int a=5; System.out.println(++a); / int b=5; System.out.println(b++); | 6 / 5(a 最终为 6,b 最终为 6) |
| – | 自减(规则同自增) | int c=5; System.out.println(–c); | 4(c 最终为 4) |
注意:
-
字符串与其他类型拼接时,其他类型会自动转为字符串(如 “年龄:” + 25 结果为 “年龄:25”);
-
整数除法中,若除数为 0,会抛出 ArithmeticException(算术异常)。
2. 赋值运算符(用于给变量赋值)
-
基本赋值:=(如 int a = 5);
-
复合赋值:+=、-=、*=、/=、%=(简化代码,且隐含自动类型转换),示例:
int x = 10;
x += 5; // 等价于 x = x + 5 → 结果 15
x *= 2; // 等价于 x = x * 2 → 结果 30
3. 比较运算符(用于判断条件,返回 boolean 类型)
| 运算符 | 功能 | 示例 | 结果 |
|---|---|---|---|
| == | 判断是否相等(基本类型比值,引用类型比地址) | 3 == 5 / “a” == “a” | false / true |
| != | 判断是否不相等 | 3 != 5 | true |
| > | 判断左 > 右 | 5 > 3 | true |
| < | 判断左 < 右 | 5 < 3 | false |
| >= | 判断左 >= 右 | 5 >= 5 | true |
| <= | 判断左 <= 右 | 5 <= 3 | false |
注意:
- 引用类型用 == 比较时,比较的是 “内存地址”(是否为同一个对象),若需比较内容,需用 equals() 方法(如 String 类的 equals(),示例:“abc”.equals(“abc”) → true)。
4. 逻辑运算符(用于组合条件,操作 boolean 类型)
| 运算符 | 功能 | 特点(短路特性) | 示例 | 结果 |
|---|---|---|---|---|
| && | 逻辑与(全 true 则 true) | 左为 false 时,右不执行 | (3>2) && (5<10) | true |
| || | 逻辑或(有 true 则 true) | 左为 true 时,右不执行 | `(3>5) | |
| ! | 逻辑非(取反) | - | !(3>5) | true |
示例:短路特性
int a = 5;
// && 短路:左 (a>10) 为 false,右 (a++) 不执行,a 仍为 5
boolean flag1 = (a > 10) && (a++ > 0);
System.out.println("flag1:" + flag1 + ",a:" + a); // false,5
// || 短路:左 (a<10) 为 true,右 (a++) 不执行,a 仍为 5
boolean flag2 = (a < 10) || (a++ > 0);
System.out.println("flag2:" + flag2 + ",a:" + a); // true,5
5. 三元运算符(三目运算符,简化条件判断)
格式:条件表达式 ? 表达式1 : 表达式2
-
若条件表达式为 true,执行表达式 1 并返回结果;
-
若条件表达式为 false,执行表达式 2 并返回结果。
示例:
int score = 85;
// 判断分数是否及格,返回对应提示
String result = (score >= 60) ? "及格" : "不及格";
System.out.println(result); // 输出:及格
四、流程控制语句
流程控制用于控制程序的执行顺序,主要分为 “顺序结构”“分支结构”“循环结构” 三类(顺序结构为默认,代码自上而下执行)。
1. 分支结构(根据条件执行不同代码)
(1)if-else 语句(单分支 / 双分支)
格式:
// 单分支(条件成立则执行)
if (条件表达式) {
// 条件为 true 时执行的代码块
}
// 双分支(条件成立/不成立分别执行)
if (条件表达式) {
// 条件为 true 时执行
} else {
// 条件为 false 时执行
}
// 多分支(多个条件判断)
if (条件1) {
// 条件1 为 true 时执行
} else if (条件2) {
// 条件1 为 false,条件2 为 true 时执行
} else {
// 所有条件都为 false 时执行
}
示例:成绩分级判断
public class IfElseDemo {
public static void main(String[] args) {
int score = 92;
if (score >= 90) {
System.out.println("成绩等级:优秀");
} else if (score >= 80) {
System.out.println("成绩等级:良好");
} else if (score >= 60) {
System.out.println("成绩等级:及格");
} else {
System.out.println("成绩等级:不及格");
}
}
}
(2)switch 语句(多值匹配,适合固定值判断)
格式:
switch (表达式) { // 表达式类型:byte、short、int、char、String、枚举
case 值1:
// 表达式 == 值1 时执行
break; // 跳出 switch(若省略,会继续执行下一个 case)
case 值2:
// 表达式 == 值2 时执行
break;
...
default:
// 表达式不匹配任何 case 时执行(可选)
break;
}
示例:根据月份判断季节
public class SwitchDemo {
public static void main(String[] args) {
int month = 3;
switch (month) {
case 3:
case 4:
case 5:
System.out.println("季节:春季");
break;
case 6:
case 7:
case 8:
System.out.println("季节:夏季");
break;
case 9:
case 10:
case 11:
System.out.println("季节:秋季");
break;
case 12:
case 1:
case 2:
System.out.println("季节:冬季");
break;
default:
System.out.println("无效月份");
break;
}
}
}
3212

被折叠的 条评论
为什么被折叠?



