Java基础语法

Java是一种面向对象的编程语言,具有严格的语法规范。本章将详细介绍Java的基础语法,包括程序结构、命名规则、数据类型、运算符等核心概念。

学习目标
  • 掌握Java程序的基本结构
  • 理解Java的命名规范和语法规则
  • 学会使用Java注释和关键字
  • 了解变量、数据类型和运算符

第一个Java程序:Hello World

让我们从一个最简单的Java程序开始,这个程序将在控制台输出"Hello World"。

/**
 * 我的第一个Java程序
 * 这是一个经典的Hello World程序
 * 程序功能:在控制台输出Hello World
 */
public class MyFirstJavaProgram {

    /**
     * main方法是Java程序的入口点
     * 每个Java应用程序都必须包含main方法
     * @param args 命令行参数数组
     */
    public static void main(String[] args) {
        // 使用System.out.println()方法在控制台输出文本
        System.out.println("Hello World");
        // 也可以使用print()方法,但不会自动换行
        System.out.print("Welcome to ");
        System.out.print("Java Programming");
    }
}

运行步骤详解

  1. 创建Java源文件
    • 打开文本编辑器(Notepad++、VS Code、IntelliJ IDEA等)
    • 将上面的代码复制到编辑器中
    • 将文件保存为MyFirstJavaProgram.java(注意:文件名必须与类名完全一致)
  2. 编译Java程序
    • 打开命令提示符(Windows)或终端(Mac/Linux)
    • 切换到Java源文件所在的目录
    • 输入编译命令:javac MyFirstJavaProgram.java
    • 如果编译成功,会生成MyFirstJavaProgram.class字节码文件
  3. 运行Java程序
    • 在命令行中输入:java MyFirstJavaProgram
    • 注意:运行时不带.class扩展名
    • 程序会输出:Hello World
完整执行过程示例
# 编译Java源文件
C:\Users\YourName> javac MyFirstJavaProgram.java

# 运行编译后的程序
C:\Users\YourName> java MyFirstJavaProgram

# 输出结果
Hello World
Welcome to Java Programming

Java基本语法规则

编写Java程序时,必须遵守以下语法规则:

规则类型 说明 示例
大小写敏感 Java区分大小写,标识符Hellohello是不同的 String name = "John";String Name = "John";
类名规范 类名首字母应大写,若由多个单词组成,每个单词首字母大写(帕斯卡命名法) MyFirstJavaClass, StudentRecord, BankAccount
方法名规范 方法名首字母小写,后续单词首字母大写(驼峰命名法) calculateTotal(), getUserName(), isValid()
源文件名 源文件名必须与公共类名完全一致,包括大小写,扩展名为.java MyClass → 文件名MyClass.java
主方法入口 Java应用程序从main方法开始执行,必须是public static void main(String[] args) public static void main(String[] args) { ... }
语句结束符 每条Java语句必须以分号;结束 int x = 10;
System.out.println("Hello");
代码块 使用花括号{}定义代码块,用于类、方法、控制语句等 if (x > 0) { System.out.println("Positive"); }

Java标识符

标识符是程序中用于命名类、方法、变量等的名称。Java标识符必须遵循以下规则:

合法标识符规则
  • 以字母(A-Z, a-z)、美元符($)或下划线(_)开头
  • 首字符后可以是字母、数字、$或_的组合
  • 不能使用Java关键字作为标识符
  • 区分大小写
  • 长度没有限制(但建议不超过255个字符)
  • 不能包含空格或特殊字符(除$和_)
非法标识符示例
  • 123abc(以数字开头)
  • my-name(包含连字符)
  • class(Java关键字)
  • my name(包含空格)
  • @variable(以@开头)
  • public(Java关键字)

标识符命名最佳实践

变量名

小写字母开头,驼峰命名法,描述性名称

int studentCount;
double accountBalance;
String firstName;
boolean isActive;
常量名

全部大写,单词间用下划线分隔

final double PI = 3.14159;
final int MAX_SIZE = 100;
final String DEFAULT_COLOR = "blue";
方法名

动词开头,驼峰命名法,描述方法功能

void calculateTotal();
String getUserName();
boolean isValidInput();

Java修饰符

Java修饰符用于修改类、方法、变量的访问权限和行为特性。主要分为两类:

访问修饰符

修饰符 作用范围 说明
public 全局可见 任何类都可以访问
protected 包内及子类可见 同一包内或子类可以访问
default(无修饰符) 包内可见 同一包内的类可以访问
private 类内可见 只有当前类可以访问

非访问修饰符

修饰符 用途 示例
final 不可继承/不可修改 final class, final variable
abstract 抽象类/方法 abstract class, abstract method
static 类级别成员 static method, static variable
synchronized 线程同步 synchronized method

修饰符使用示例

public class Student {
    // 公共静态常量
    public static final int MAX_SCORE = 100;

    // 私有实例变量
    private String name;
    private int age;

    // 受保护的变量(子类可访问)
    protected String studentId;

    // 包级私有变量
    String department; // 默认访问修饰符

    // 公共方法
    public String getName() {
        return name;
    }

    // 私有方法
    private void validateAge() {
        if (age < 0) age = 0;
    }

    // 静态方法
    public static void displayInfo() {
        System.out.println("Student Information");
    }

    // final方法(不能被子类重写)
    public final void register() {
        System.out.println("Student registered");
    }
}

Java变量类型

Java中有三种主要的变量类型:

局部变量

在方法、构造函数或代码块中声明的变量

  • 声明在方法内部
  • 作用域仅限于声明它的代码块
  • 必须在使用前初始化
  • 没有默认值
public void calculate() {
    int result = 0;  // 局部变量
    int x = 10, y = 20;
    result = x + y;
}
实例变量(成员变量)

在类中声明的变量,但在方法、构造函数或代码块之外

  • 每个对象都有独立的副本
  • 有默认值(数值为0,布尔为false,对象为null)
  • 访问修饰符控制其可见性
public class Student {
    // 实例变量
    private String name;
    private int age;

    public Student(String n, int a) {
        name = n;  // 使用实例变量
        age = a;
    }
}
类变量(静态变量)

使用static关键字声明的变量

  • 类的所有实例共享同一个副本
  • 可以通过类名直接访问
  • 常用于常量或类级别的计数器
public class Car {
    // 类变量
    public static int carCount = 0;

    public Car() {
        carCount++;  // 所有Car对象共享
    }
}

// 访问方式
System.out.println(Car.carCount);

Java枚举

Java 5.0引入了枚举类型,用于定义一组命名的常量。枚举提高了代码的可读性和类型安全性。

基本枚举示例

// 定义一个枚举类型
enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY
}

// 使用枚举
public class EnumTest {
    Day day;

    public EnumTest(Day day) {
        this.day = day;
    }

    public void tellItLikeItIs() {
        switch (day) {
            case MONDAY:
                System.out.println("Mondays are bad.");
                break;
            case FRIDAY:
                System.out.println("Fridays are better.");
                break;
            case SATURDAY: case SUNDAY:
                System.out.println("Weekends are best.");
                break;
            default:
                System.out.println("Midweek days are so-so.");
        }
    }
}

带属性和方法的枚举

// 高级枚举示例
enum Size {
    // 枚举常量,调用构造函数
    SMALL("S", "小杯"),
    MEDIUM("M", "中杯"),
    LARGE("L", "大杯"),
    EXTRA_LARGE("XL", "超大杯");

    // 枚举属性
    private String abbreviation;
    private String description;

    // 枚举构造函数(必须是私有的)
    private Size(String abbreviation, String description) {
        this.abbreviation = abbreviation;
        this.description = description;
    }

    // 枚举方法
    public String getAbbreviation() {
        return abbreviation;
    }

    public String getDescription() {
        return description;
    }

    // 静态方法:根据缩写获取枚举
    public static Size fromAbbreviation(String abbr) {
        for (Size size : Size.values()) {
            if (size.getAbbreviation().equals(abbr)) {
                return size;
            }
        }
        return null;
    }
}

// 使用示例
public class FreshJuice {
    Size size;

    public static void main(String[] args) {
        FreshJuice juice = new FreshJuice();
        juice.size = Size.MEDIUM;

        System.out.println("Size: " + juice.size);
        System.out.println("Abbreviation: " + juice.size.getAbbreviation());
        System.out.println("Description: " + juice.size.getDescription());
    }
}

Java关键字

Java关键字是Java语言保留的具有特殊含义的单词,不能用作标识符名称。

数据类型关键字
boolean
byte
char
double
float
int
long
short
void
流程控制关键字
if
else
switch
case
default
while
do
for
break
continue
return
访问修饰符关键字
public
private
protected
default
final
static
abstract
synchronized
volatile
transient
其他重要关键字
class
interface
extends
implements
new
this
super
instanceof
try
catch
finally
throw
throws
enum
package
import
注意:
  • constgoto是Java保留字,但目前未使用
  • 从Java 10开始,var作为局部变量类型推断的关键字
  • truefalsenull虽然看起来像关键字,但实际上是字面量

Java注释

注释用于解释代码,提高可读性。Java编译器会忽略注释。Java支持三种注释:

单行注释

//开头,到行尾结束

// 这是一个单行注释
int x = 10; // 这是行尾注释
// int y = 20; // 这行代码被注释掉了
多行注释

/*开头,以*/结尾

/* 这是一个多行注释
   可以跨越多行
   用于较长的说明 */
int x = 10;
/*
   也可以注释掉
   多行代码
   int y = 20;
   int z = 30;
*/
文档注释

/**开头,以*/结尾,用于生成API文档

/**
 * 这是一个文档注释
 * 可以使用HTML标签和Javadoc标签
 * @param name 用户名
 * @return 欢迎消息
 */
public String welcome(String name) {
    return "Hello, " + name;
}

注释的最佳实践

  • 解释为什么,而不是是什么:代码本身应该清楚地表明"是什么",注释应该解释"为什么"这么做
  • 保持注释更新:当代码修改时,相关的注释也需要更新
  • 避免明显的注释:不要写像x = x + 1; // 将x加1这样的注释
  • 使用文档注释:为公共类、接口、方法和方法参数添加文档注释
  • 注释复杂算法:为复杂的算法或逻辑添加解释性注释

综合示例

下面是一个综合示例,展示Java基础语法的实际应用:

/**
 * 学生类
 * 演示Java基础语法的综合应用
 */
public class Student {

    // 类变量:所有学生共享的计数器
    private static int studentCount = 0;

    // 常量:使用final关键字
    public static final int MAX_AGE = 100;

    // 实例变量:每个学生对象都有自己的值
    private String name;
    private int age;
    private String studentId;

    // 枚举:成绩等级
    enum Grade {
        A, B, C, D, F
    }

    /**
     * 构造函数
     * @param name 学生姓名
     * @param age 学生年龄
     */
    public Student(String name, int age) {
        // 使用this关键字区分实例变量和参数
        this.name = name;

        // 使用条件语句验证年龄
        if (age >= 0 && age <= MAX_AGE) {
            this.age = age;
        } else {
            this.age = 0;
            System.out.println("年龄无效,已设置为0");
        }

        // 生成学生ID
        this.studentId = "STU" + (++studentCount);
    }

    /**
     * 获取学生信息
     * @return 学生信息字符串
     */
    public String getInfo() {
        return "学生ID: " + studentId +
               ", 姓名: " + name +
               ", 年龄: " + age;
    }

    /**
     * 根据分数计算等级
     * @param score 分数
     * @return 等级
     */
    public Grade calculateGrade(double score) {
        // 使用switch表达式(Java 14+)
        return switch ((int)(score / 10)) {
            case 10, 9 -> Grade.A;
            case 8 -> Grade.B;
            case 7 -> Grade.C;
            case 6 -> Grade.D;
            default -> Grade.F;
        };
    }

    /**
     * 主方法:程序入口
     */
    public static void main(String[] args) {
        // 创建学生对象
        Student student1 = new Student("张三", 20);
        Student student2 = new Student("李四", 22);

        // 访问实例方法
        System.out.println(student1.getInfo());
        System.out.println(student2.getInfo());

        // 访问类变量
        System.out.println("学生总数: " + Student.studentCount);

        // 使用枚举
        Grade grade = student1.calculateGrade(85.5);
        System.out.println("成绩等级: " + grade);

        // 使用常量
        System.out.println("最大允许年龄: " + Student.MAX_AGE);
    }
}

常见错误与调试技巧

常见编译错误
  1. 缺少分号int x = 10int x = 10;
  2. 大小写错误System.out.printlnsystem.out.println
  3. 类名与文件名不匹配:类MyClass必须保存在MyClass.java
  4. 变量未初始化:局部变量在使用前必须初始化
  5. 括号不匹配:确保所有括号都正确配对
调试技巧
  1. 使用System.out.println():在关键位置输出变量值
  2. 分步调试:使用IDE的调试功能逐步执行代码
  3. 检查错误信息:仔细阅读编译器提供的错误信息
  4. 代码简化:注释掉部分代码,逐步排查问题
  5. 使用断言assert x > 0 : "x必须大于0";