← Backend / Java

09_Java 基础语法

Java 基本语法、标识符、关键字、注释、继承与接口概述

public class demo {
	public static void main(String[] args) {
		System.out.println("Hello World!");
	}
}

![[java-基础语法1.png]]

  • 在命令行窗口输入 javac HelloWorld.java 按下回车键编译代码。如果代码没有错误,cmd 命令提示符会进入下一行(假设环境变量都设置好了)。
  • 再键输入 java HelloWorld 按下回车键就可以运行程序了


基本语法

编写 Java 程序时,应注意以下几点:

  • 大小写敏感:Java 是大小写敏感的,这就意味着标识符 Hello 与 hello 是不同的。
  • 类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass 。
  • 方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。
  • 源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记 Java 是大小写敏感的),文件名的后缀为 .java。(如果文件名和类名不相同则会导致编译错误)。
  • 主方法入口:所有的 Java 程序由 public static void main(String[] args) 方法开始执行。

Java 标识符

Java 所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。

关于 Java 标识符,有以下几点需要注意:

  • 所有的标识符都应该以字母(A-Z 或者 a-z),美元符($)、或者下划线(_)开始
  • 首字符之后可以是字母(A-Z 或者 a-z),美元符($)、下划线(_)或数字的任何字符组合
  • 关键字不能用作标识符
  • 标识符是大小写敏感的
  • 合法标识符举例:age、$salary、_value、__1_value
  • 非法标识符举例:123abc、-salary

Java修饰符

像其他语言一样,Java可以使用修饰符来修饰类中方法和属性。主要有两类修饰符:

  • 访问控制修饰符 : default, public , protected, private
  • 非访问控制修饰符 : final, abstract, static, synchronized

Java 变量

Java 中主要有如下几种类型的变量

  • 局部变量
  • 类变量(静态变量)
  • 成员变量(非静态变量)

Java 数组

数组是储存在堆上的对象,可以保存多个同类型变量。


Java 枚举

Java 5.0引入了枚举,枚举限制变量只能是预先设定好的值。使用枚举可以减少代码中的 bug。

例如,我们为果汁店设计一个程序,它将限制果汁为小杯、中杯、大杯。这就意味着它不允许顾客点除了这三种尺寸外的果汁。
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 关键字。这些保留字不能用于常量、变量、和任何标识符的名称。

类别 关键字 说明
访问控制 private 私有的
protected 受保护的
public 公共的
default 默认
类、方法和变量修饰符 abstract 声明抽象
class 类
extends 扩充、继承
final 最终值、不可改变的
implements 实现(接口)
interface 接口
native 本地、原生方法(非 Java 实现)
new 创建
static 静态
strictfp 严格浮点、精准浮点
synchronized 线程、同步
transient 短暂
volatile 易失
程序控制语句 break 跳出循环
case 定义一个值以供 switch 选择
continue 继续
do 运行
else 否则
for 循环
if 如果
instanceof 实例
return 返回
switch 根据值选择执行
while 循环
错误处理 assert 断言表达式是否为真
catch 捕捉异常
finally 有没有异常都执行
throw 抛出一个异常对象
throws 声明一个异常可能被抛出
try 捕获异常
包相关 import 引入
package 包
基本类型 boolean 布尔型
byte 字节型
char 字符型
double 双精度浮点
float 单精度浮点
int 整型
long 长整型
short 短整型
变量引用 super 父类、超类
this 本类
void 无返回值
保留关键字 goto 是关键字,但不能使用
const 是关键字,但不能使用

注意:Java 的 null 不是关键字,类似于 true 和 false,它是一个字面常量,不允许作为标识符使用。


Java注释

类似于 C/C++、Java 也支持单行以及多行注释。

注释中的字符将被 Java 编译器忽略。

public class HelloWorld {
   /* 这是第一个Java程序
    * 它将输出 Hello World
    * 这是一个多行注释的示例
    */
    public static void main(String[] args){
       // 这是单行注释的示例
       /* 这个也是单行注释的示例 */
       System.out.println("Hello World"); 
    }
}

继承

在 Java 中,一个类可以由其他类派生。如果你要创建一个类,而且已经存在一个类具有你所需要的属性或方法,那么你可以将新创建的类继承该类。

利用继承的方法,可以重用已存在类的方法和属性,而不用重写这些代码。被继承的类称为超类(super class),派生类称为子类(sub class)。


接口

在 Java 中,接口可理解为对象间相互通信的协议。接口在继承中扮演着很重要的角色。

接口只定义派生要用到的方法,但是方法的具体实现完全取决于派生类。


Java 源程序与编译型运行区别

如下图所示:

Java 源文件先由 javac 编译为字节码(.class),再由 JVM 加载并执行;JVM 可解释执行或将热点代码即时编译为机器码。


注解(Annotation)

注解是以 @ 开头的标记,用于向编译器或运行时传递额外信息,本身不改变程序逻辑。

内置常用注解

注解 作用
@Override 告诉编译器"这是重写父类方法",写错方法名时编译器会报错
@Deprecated 标记方法 / 类已过时,调用时 IDE 会划删除线并警告
@SuppressWarnings 压制指定类型的编译警告
@FunctionalInterface 标记接口是函数式接口(只有一个抽象方法),Lambda 的前提
class Animal {
    void makeSound() {
        System.out.println("...");
    }
}

class Dog extends Animal {
    @Override                    // 如果拼写错误,编译器立刻报错
    void makeSound() {
        System.out.println("汪汪!");
    }

    @Deprecated                  // 标记为过时
    void oldMethod() { }
}

@FunctionalInterface
interface Calculator {
    int compute(int a, int b);   // 只能有一个抽象方法
}

// 使用 Lambda 实现函数式接口
Calculator add = (a, b) -> a + b;
System.out.println(add.compute(3, 5));  // 8

var 类型推断(Java 10+)

Java 10 引入 var 关键字,让编译器自动推断局部变量的类型,减少冗长的类型声明:

// 传统写法
ArrayList<String> names = new ArrayList<String>();
Map<String, List<Integer>> map = new HashMap<String, List<Integer>>();

// var 写法:类型由右侧表达式推断
var names = new ArrayList<String>();       // 推断为 ArrayList<String>
var map = new HashMap<String, List<Integer>>();

// 在 for 循环中同样适用
for (var name : names) {
    System.out.println(name.toUpperCase());
}

注意事项:

  • var 只能用于局部变量,不能用于方法参数、返回类型或成员变量
  • 声明时必须立刻初始化(编译器需要右侧的表达式来推断类型)
  • var 不是关键字,可以作为变量名(但强烈不建议)
var x = 10;           // int
var msg = "hello";    // String
var pi = 3.14;        // double

var ambiguous;        // ❌ 编译错误!没有初始化,无法推断类型

Text Blocks(文本块,Java 15+)

Text Blocks 用三引号 """ 定义多行字符串,不需要手动拼接 \n 和转义引号,常用于内嵌 JSON、HTML、SQL:

// 传统写法:拼接麻烦,可读性差
String json = "{\n" +
              "  \"name\": \"Alice\",\n" +
              "  \"age\": 30\n" +
              "}";

// Text Block:所见即所得
String json = """
        {
          "name": "Alice",
          "age": 30
        }
        """;

// 内嵌 SQL
String sql = """
        SELECT *
        FROM users
        WHERE age > 18
        ORDER BY name
        """;

System.out.println(json);