1. Java高级特性速通指南:从零基础到精通
作为Java开发者,掌握高级特性是进阶的必经之路。本文将系统性地梳理Java核心高级特性,包括static、final、继承、多态、抽象类、接口、内部类和枚举等关键概念,帮助开发者快速掌握Java高级编程技巧。
1.1 static关键字的深度解析
static是Java中最基础也最常用的关键字之一,它用于修饰类的成员变量和方法,使其成为类级别的成员,而非对象级别的成员。
1.1.1 static修饰成员变量
当static修饰成员变量时,该变量将成为静态变量(也称为类变量),具有以下特点:
- 内存中只加载一次:无论创建多少个对象,静态变量在内存中只有一份拷贝
- 被类和所有对象共享:所有实例访问的是同一个静态变量
- 生命周期长:随着类的加载而加载,随着类的消失而消失
java复制public class Student {
// 静态变量:有static修饰,属于类持有
static String name;
// 实例变量:无static修饰,属于每个对象
int age;
}
public static void main(String[] args) {
// 推荐方式:类名.静态变量
Student.name = "袁华";
System.out.println(Student.name); // 输出:袁华
// 不推荐方式:对象.静态变量
Student s1 = new Student();
s1.name = "马冬梅";
Student s2 = new Student();
s2.name = "秋雅";
System.out.println(s1.name); // 输出:秋雅(因为静态变量被共享)
// 实例变量访问
s1.age = 23;
s2.age = 18;
System.out.println(s1.age); // 输出:23
}
注意事项:
- 静态变量推荐使用类名直接访问,而非通过对象访问
- 静态变量常用于存储类级别的配置信息或共享数据
- 多线程环境下访问静态变量需要注意线程安全问题
1.1.2 static修饰成员方法
static修饰的方法称为静态方法(类方法),具有以下特点:
- 属于类而非对象:可以直接通过类名调用
- 只能访问静态成员:不能直接访问实例变量和实例方法
- 不能使用this关键字:因为静态方法不依赖于任何对象
java复制public class MathUtils {
// 工具类通常私有化构造器,防止实例化
private MathUtils() {}
// 静态方法
public static int add(int a, int b) {
return a + b;
}
// 同一类下调用静态方法可以省略类名
public static int multiply(int a, int b) {
return a * b;
}
public static void printResult(int result) {
System.out.println("结果是:" + result);
}
}
// 使用
int sum = MathUtils.add(5, 3); // 直接通过类名调用
MathUtils.printResult(sum);
工具类设计原则:
- 工具类通常设计为final类,防止被继承
- 构造器私有化,防止实例化
- 所有方法都应该是静态方法
- 方法设计应尽量无状态,避免使用静态变量存储状态
1.1.3 静态代码块
静态代码块是在类加载时自动执行的代码块,常用于初始化静态变量:
java复制public class DatabaseConfig {
public static final String DRIVER_CLASS;
public static final String URL;
public static final String USERNAME;
public static final String PASSWORD;
// 静态代码块
static {
// 模拟从配置文件中加载数据库配置
Properties props = new Properties();
try {
props.load(DatabaseConfig.class.getResourceAsStream("/db.properties"));
DRIVER_CLASS = props.getProperty("driver");
URL = props.getProperty("url");
USERNAME = props.getProperty("username");
PASSWORD = props.getProperty("password");
} catch (IOException e) {
throw new RuntimeException("加载数据库配置失败", e);
}
}
}
静态代码块特点:
- 在类加载时自动执行,且只执行一次
- 执行顺序优先于实例代码块和构造器
- 常用于初始化静态资源,如加载配置文件、建立数据库连接池等
1.1.4 实例代码块
实例代码块在每次创建对象时执行,优先于构造器执行:
java复制public class Order {
private String orderId;
private Date createTime;
private List<String> items;
// 实例代码块
{
this.createTime = new Date();
this.items = new ArrayList<>();
System.out.println("实例代码块执行:初始化订单创建时间和商品列表");
}
public Order(String orderId) {
this.orderId = orderId;
System.out.println("构造器执行:设置订单ID");
}
}
// 测试
Order order1 = new Order("ORD001");
Order order2 = new Order("ORD002");
实例代码块特点:
- 每次创建对象时都会执行
- 执行顺序在构造器之前
- 常用于初始化实例变量的默认值
- 多个实例代码块按声明顺序执行
1.2 单例设计模式
单例模式确保一个类只有一个实例,并提供一个全局访问点。Java中实现单例有多种方式,下面介绍三种常见实现。
1.2.1 饿汉式单例
java复制public class SingletonEager {
// 2. 静态变量保存唯一实例
private static final SingletonEager INSTANCE = new SingletonEager();
// 1. 私有化构造器
private SingletonEager() {
// 防止反射攻击
if (INSTANCE != null) {
throw new RuntimeException("单例模式禁止反射创建");
}
}
// 3. 提供静态方法获取实例
public static SingletonEager getInstance() {
return INSTANCE;
}
}
特点:
- 线程安全:类加载时就创建实例,JVM保证线程安全
- 简单直接:实现简单,没有同步开销
- 可能造成资源浪费:即使不使用也会创建实例
1.2.2 懒汉式单例
java复制public class SingletonLazy {
// 2. 静态变量保存唯一实例,volatile保证可见性和有序性
private static volatile SingletonLazy instance;
// 1. 私有化构造器
private SingletonLazy() {}
// 3. 双重检查锁定
public static SingletonLazy getInstance() {
if (instance == null) {
synchronized (SingletonLazy.class) {
if (instance == null) {
instance = new SingletonLazy();
}
}
}
return instance;
}
}
特点:
- 延迟加载:只有使用时才创建实例
- 线程安全:双重检查锁定保证线程安全
- 实现较复杂:需要考虑同步问题
- volatile关键字防止指令重排序
1.2.3 枚举单例
java复制public enum SingletonEnum {
INSTANCE;
// 可以添加方法
public void doSomething() {
System.out.println("枚举单例方法执行");
}
}
// 使用
SingletonEnum.INSTANCE.doSomething();
特点:
- 最安全的单例实现方式
- 天然防止反射和序列化破坏单例
- 代码简洁
- JDK5及以上版本支持
单例模式使用场景:
- 配置管理类
- 数据库连接池
- 线程池
- 缓存系统
- 日志系统
1.3 继承与多态
继承和多态是面向对象编程的核心特性,Java通过extends关键字实现继承。
1.3.1 继承基础
java复制// 父类
public class Animal {
protected String name;
public Animal(
