Java 修饰符详解

在 Java 中,修饰符(Modifiers)用于控制类、方法、变量或其他成员的行为和访问权限。它们可以分为两类:访问修饰符非访问修饰符。以下是 Java 修饰符的详细介绍:

一、访问修饰符(Access Modifiers)

用于控制成员的访问范围,共有 4 种级别:

  1. public
    • 访问权限:无限制,所有类均可访问。
    • 示例:
       
      public class MyClass {
          public int publicVar;
          public void publicMethod() { /* ... */ }
      }
      
       
  2. protected
    • 访问权限:同一包内的类和所有子类(无论是否在同一包内)。
    • 示例:
       
      protected double protectedVar;
      protected void protectedMethod() { /* ... */ }
      
       
  3. 默认(无修饰符)
    • 访问权限:同一包内的类可访问(也称为 “包私有”)。
    • 示例:
       
      String defaultVar; // 默认访问修饰符
      void defaultMethod() { /* ... */ }
      
       
  4. private
    • 访问权限:仅当前类可访问。
    • 示例:
       
      private int privateVar;
      private void privateMethod() { /* ... */ }
      
       

访问修饰符总结表

修饰符同一类同一包子类(同包)子类(不同包)其他包
public
protected
默认
private

二、非访问修饰符(Non-Access Modifiers)

用于改变类、方法或变量的功能特性:

1. static

  • 作用:属于类,而非实例。
  • 特点
    • 静态变量(类变量):所有实例共享同一个副本。
    • 静态方法:可直接通过类名调用,不能使用this或访问非静态成员。
  • 示例
     
     
    public class MyClass {
        static int count = 0; // 静态变量
        public static void increment() {
            count++; // 静态方法访问静态变量
        }
    }
    
     

2. final

  • 作用:不可变。
  • 应用场景
    • 变量:赋值后不可修改(常量)。
    • 方法:禁止被子类重写。
    • :禁止被继承。
  • 示例
     
     
    final double PI = 3.14; // 常量
    public final void show() { /* ... */ } // 不可重写的方法
    public final class FinalClass { /* ... */ } // 不可继承的类
    
     

3. abstract

  • 作用:声明抽象类或方法。
  • 特点
    • 抽象类:不能实例化,需被继承。
    • 抽象方法:只有声明,没有实现,子类必须重写。
  • 示例
     
     
    public abstract class Animal {
        public abstract void sound(); // 抽象方法
    }
    
    public class Dog extends Animal {
        @Override
        public void sound() {
            System.out.println("汪汪");
        }
    }
    
     

4. synchronized

  • 作用:用于方法或代码块,保证同一时间只有一个线程访问。
  • 示例
     
     
    public synchronized void add(int value) {
        // 线程安全的方法
    }
    
     

5. volatile

  • 作用:确保变量在多线程中的可见性(每次读取都从主内存获取最新值)。
  • 示例
     
     
    private volatile boolean running = true;
    
     

6. transient

  • 作用:用于序列化时忽略某些字段。
  • 示例
     
    private transient String password; // 序列化时会被忽略
    
     

7. native

  • 作用:声明由本地代码(如 C/C++)实现的方法。
  • 示例
     
    public native void display(); // 本地方法
    
     

三、修饰符使用规则

  1. 类修饰符
    • 外部类:只能用public、默认、abstractfinal
    • 内部类:可以使用所有修饰符。
  2. 方法修饰符
    • 不能同时使用abstractfinal(矛盾)。
    • 不能同时使用abstractstatic(静态方法需有实现)。
  3. 变量修饰符
    • final变量必须显式初始化。
    • static final常用于定义常量(如public static final int MAX = 100)。

四、示例代码

 
public class ModifierExample {
    private static int counter = 0; // 静态私有变量
    protected final String NAME;    // 常量,必须在构造函数中初始化
    
    public ModifierExample(String name) {
        this.NAME = name;
    }
    
    public static void increment() {
        counter++;
    }
    
    public abstract void display(); // 抽象方法(需在子类中实现)
    
    public synchronized void update() {
        // 线程安全的方法
    }
}

五、总结

  • 访问修饰符控制可见性,public最开放,private最严格。
  • 非访问修饰符增强功能,如staticfinalabstract等。
  • 合理使用修饰符可提高代码的安全性、可维护性和性能。

掌握修饰符是 Java 编程的基础,它们在封装、继承、多态等面向对象特性中起着关键作用。

posted on 2025-06-16 10:39  coding博客  阅读(160)  评论(0)    收藏  举报