Java 基础语法
Java 程序本质上是由一系列相互协作的对象构成的集合体,这些对象通过彼此调用方法来实现协同工作。为了更好地理解 Java 的面向对象特性,我们需要明确以下几个核心概念:
- 类:作为对象的蓝图或模板,定义了对象的属性和行为。
- 对象:类的具体实例,具有状态和行为。
- 方法:定义在类中的行为,用于执行特定功能。
- 实例变量:每个对象独有的数据成员,用于存储对象的状态。
第一个 Java 程序
下面我们来看一个简单的 Java 程序示例,这个程序会在控制台输出字符串 "Hello World":
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World"); // 输出 Hello World
}
}
基本语法
在编写 Java 程序时,需要特别注意以下几个关键规范和要求:
1. 大小写敏感性
- Java 是严格区分大小写的语言
- 例如:
Hello
和hello
会被视为完全不同的标识符
2. 类名命名规范
- 应采用大驼峰式命名法(Pascal Case)
- 每个单词首字母大写,不使用下划线
- 示例:
StudentRecord
和BankAccount
3. 方法命名规范
- 应采用小驼峰式命名法(Camel Case)
- 首字母小写,后续单词首字母大写
- 示例:
calculateTotal()
和getUserName()
4. 源文件命名规则
- 必须与公共类名完全一致(包括大小写)
- 文件扩展名必须为
.java
- 例如:
MyFirstApp
必须保存在MyFirstApp.java
文件中
5. 程序入口规范
- 所有可执行 Java 程序必须包含:
这是 Java 虚拟机 JVM 开始执行程序的唯一入口点public static void main(String[] args)
- 文件扩展名必须为
.java
- 例如:
MyFirstApp
必须保存在MyFirstApp.java
文件中
Java 标识符
在 Java 编程中,所有的代码组成部分都需要有明确的命名,这些名称统称为标识符(Identifiers)。
✅ 标识符用于标识类、变量、方法、包等各种程序元素,标识符的命名需要遵循以下规则:
- 首字符必须是(
A-Z
或者a-z
),美元符($
)、或者下划线(_
)之一 - 首字符之后可以是字母(
A-Z
或者a-z
),美元符($
)、下划线(_
)或数字的任何字符组合 - 关键字不能用作标识符
- 标识符是大小写敏感的
- 合法标识符举例:
age
、$salary
、_value、__1_value
- 非法标识符举例:
123abc
、-salary
Java 修饰符
在 Java 中,修饰符(Modifiers)用于控制类、方法、变量等的访问权限和行为特性。
✅ 修饰符主要分为以下两大类:
访问修饰符(Access Modifiers)用于控制类、方法、变量的访问范围,包括:
public
:公开访问,任何类均可访问。protected
:仅允许同一包内的类及子类访问。private
:仅允许当前类内部访问。- 默认(无修饰符):仅允许同一包内的类访问(包级私有)。
非访问修饰符(Non-Access Modifiers)用于定义额外的行为特性,包括:
static
:表示类成员(静态变量或静态方法),属于类而非实例。final
:修饰变量(常量)、方法(不可重写)或类(不可继承)。abstract
:修饰类(不能实例化)或方法(无实现,需子类重写)。synchronized
:用于多线程,确保方法或代码块同一时间仅一个线程执行。transient
:修饰变量,使其在序列化时被忽略。volatile
:修饰变量,确保多线程环境下的可见性。
Java 变量
✅ Java中有三种主要的变量类型,它们在声明位置、作用域和生命周期上有所不同:
局部变量 (Local Variables)
1. 定义:在方法、构造函数或代码块内部声明的变量。
2. 特点:
- 只在声明它的方法/代码块中可见
- 没有默认值,必须初始化后才能使用
- 存储在栈内存中
- 生命周期与方法/代码块的执行周期相同
public void myMethod() {
int localVar = 10; // 局部变量
System.out.println(localVar);
}
成员变量/实例变量 (Instance Variables)
1. 定义:在类中但在方法、构造函数和代码块之外声明的变量
2. 特点:
- 属于类的实例(对象)
- 每个对象有自己的一份拷贝
- 有默认值(数值型为0,布尔型为false,对象引用为null)
- 存储在堆内存中
- 生命周期与对象相同
public class MyClass {
int instanceVar; // 成员变量/实例变量
public MyClass(int value) {
this.instanceVar = value;
}
}
类变量/静态变量 (Class/Static Variables)
1. 定义:使用static
关键字声明的成员变量
2. 特点:
- 属于类而非类的任何特定实例
- 所有实例共享同一个静态变量
- 可以通过类名直接访问(无需创建实例)
- 有默认值(同实例变量)
- 存储在方法区
- 生命周期与程序运行周期相同
public class MyClass {
static int staticVar = 100; // 类变量/静态变量
}
变量类型关系比较表
特性 | 局部变量 | 成员变量 | 类变量 |
---|---|---|---|
声明位置 | 方法/代码块内部 | 类中方法外 | 类中方法外,带static |
作用域 | 仅在声明块内 | 整个类内部 | 整个类内部 |
初始化要求 | 必须初始化 | 有默认值,可不显式初始化 | 有默认值,可不显式初始化 |
存储位置 | 栈内存 | 堆内存 | 方法区 |
生命周期 | 方法执行期间 | 对象存在期间 | 程序运行期间 |
访问方式 | 直接访问 | 通过对象实例访问 | 通过类名或对象实例访问 |
是否线程安全 | 是(每个线程有自己的栈) | 否 | 否 |
Java 数组
数组是一种重要的数据结构,它是存储在堆内存中的对象,用于存储多个相同数据类型的元素。
// 创建长度为5的整型数组
int[] arr = new int[5];
// 创建后赋值
arr[0] = 10;
arr[1] = 20;
Java 枚举
Java 5.0 引入了枚举(enum)类型,它是一种特殊的类,用于定义一组固定的常量。枚举通过限制变量只能取预先定义好的值,可以显著提高代码的安全性和可读性,从而减少潜在的错误。
class FreshJuice {
enum FreshJuiceSize{ SMALL, MEDIUM , LARGE }
FreshJuiceSize size;
}
public class FreshJuiceTest {
public static void main(String[] args){
FreshJuice juice = new FreshJuice();
juice.size = FreshJuice.FreshJuiceSize.MEDIUM ;
}
}
注意:枚举可以单独声明或者声明在类里面。方法、变量、构造函数也可以在枚举中定义。
Java 关键字
下面列出了 Java 关键字。这些保留字不能用于常量、变量、和任何标识符的名称。
分类 | 关键字 | 说明 |
---|---|---|
访问控制 | public, protected, private | 访问修饰符 |
类、方法和变量修饰符 | class, interface, abstract, final, static, synchronized, volatile, transient, native, strictfp | 定义类结构和成员特性 |
程序控制 | if, else, switch, case, default, while, do, for, break, continue, return, instanceof | 流程控制语句 |
异常处理 | try, catch, finally, throw, throws | 异常处理机制 |
包相关 | package, import | 包管理 |
基本类型 | byte, short, int, long, float, double, char, boolean | 原始数据类型 |
其他 | void, new, super, this, enum, assert | 特殊用途关键字 |
保留未使用 | const, goto | 保留关键字(无实际功能) |
注意:true/false/null 是字面量不是关键字 | var (Java 10+) 是保留类型名
Java 注释
Java 提供了灵活的注释机制,与 C/C++ 类似,支持两种注释方式。
注释是程序中的非执行文本,编译器会完全忽略注释内容。
✅ 单行注释
使用双斜线 // 表示,从符号开始到行尾的内容都会被编译器忽略,如下:
// 这是单行注释
int x = 10; // 代码后的注释
✅ 多行注释
使用 /* 和 */ 包裹注释内容,可以跨越多行,如下:
/* 这是多行注释
可以包含多行内容
特别适合较长的说明 */
✅ 文档注释
使用 /** 文档注释 */ 包裹注释内容,用于生成 API 文档,如下:
/**
* 获取用户信息
* @param userId 用户ID
* @return 用户对象
*/
public User getUser(int userId) {
// 方法实现...
}
反馈提交成功
感谢您的反馈,我们将尽快处理您的反馈