提示:本文讲述静态、枚举、包装类、抽象类、内部类

7.1 静态

7.1.1 静态关键字(static)

        静态关键字用于修饰与类而非对象关联的成员变量和方法。当成员变量或方法与类的实例无关时,使用static可以避免为每个对象单独存储或调用,提升效率和代码简洁性。

7.1.2 静态变量
  • 语法格式

    【修饰符】 class 类名 {
        【其他修饰符】 static 数据类型 变量名;
    }
  • 特点

    • 默认值与实例变量相同(基本类型为0/false,引用类型为null)。
    • 所有对象共享同一份数据,存储在方法区。
    • 本类中可直接使用;其他类中通过类名.变量名访问(推荐)或对象.变量名访问。
    • 静态变量的get/set方法需为静态方法,重名时用类名.变量名区分。
  • 内存分析
    静态变量在类加载时分配内存,生命周期与类相同,独立于对象实例。

  • 与其他变量对比

    • 静态变量:方法区存储,类共享,有默认值。
    • 实例变量:堆存储,对象独立,有默认值。
    • 局部变量:栈存储,无默认值,作用域限于方法/块。
7.1.3 静态方法
  • 语法格式
    【修饰符】 static 返回值类型 方法名(参数列表) {
        方法体
    }
  • 特点
    • 可直接通过类名.方法名()调用,无需实例化。
    • 可继承但不可重写(子类同名方法为隐藏而非覆盖)。
    • 调用时基于编译时类型(多态不适用)。
7.1.4 静态代码块
  • 语法格式
    static {
        // 初始化代码
    }
  • 特点
    • 用于静态变量初始化,类加载时执行一次。
    • 执行优先级高于非静态代码块和构造器。

静态与非静态的区别

1、本类中的访问限制区别
  • 静态直接访问静态,可以

  • 非静态直接访问非静态,可以

  • 非静态直接访问静态,可以

  • 静态直接访问非静态,不可以

2、在其他类的访问方式区别

        静态的类变量和静态的方法可以通过“类名.”的方式直接访问;也可以通过“对象."的方式访问。(但是更推荐使用类名的方式)

非静态的实例变量和非静态的方法==只能==通过“对象."方式访问。

3、this和super的使用
静态的方法和静态的代码块中,==不允许==出现this和super关键字,如果有重名问题,使用“类名.”进行区别。

非静态的方法和非静态的代码块中,可以使用this和super关键字。


7.2 单例模式(补充)

7.2.1 饿汉式实现
class Singleton {
    private static final Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}
7.2.2 懒汉式实现(线程安全)
class Singleton {
    private static volatile Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

7.3 枚举类

7.3.1 定义与使用
enum Weekday {
    MONDAY, TUESDAY, WEDNESDAY;
}
  • 特点
    • 天然单例,线程安全。
    • 可添加构造器、方法及字段,实现复杂逻辑。
7.3.2 枚举与设计模式
  • 状态模式:通过枚举实现状态机。
  • 策略模式:枚举成员封装不同策略。

包装类

        Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,然而当要使用只针对对象设计的API或新特性(例如泛型),那么基本数据类型的数据就需要用包装类来包装。

7.4 内部类

7.4.1 成员内部类
class Outer {
    class Inner {}
}
  • 访问规则:可访问外部类所有成员,包括私有。
7.4.2 静态内部类
class Outer {
    static class Inner {}
}
  • 特点:不依赖外部类实例,仅能访问外部类静态成员。
7.4.3 匿名内部类
Runnable r = new Runnable() {
    @Override
    public void run() {}
};

7.5 代码示例整合

  • 静态变量示例Employee类演示共享companytotal
  • 静态方法示例FatherSon类展示继承与隐藏。
  • 静态代码块示例Chinese类验证初始化顺序。

通过以上结构,系统化掌握静态成员、单例、枚举和内部类的核心概念与应用场景。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐