Java 修饰符

修饰符用来给类、方法、变量附加属性:一类控制「谁能访问」,叫访问修饰符;另一类改变「行为特性」,叫非访问修饰符。

访问修饰符可见范围

Java 有 public、protected、默认(不写)与 private 四种访问级别:

修饰符同类同包子类(不同包)任意类
public可以可以可以可以
protected可以可以可以不可以
默认(不写)可以可以不可以不可以
private可以不可以不可以不可以

经验法则:类尽量用 public,成员变量尽量 private,方法按需放行,尽量缩小暴露面。

非访问修饰符一览

修饰符作用
static静态,属于类而不是某个对象
final最终,不可继承、不可重写、不可再赋值
abstract抽象,类不可实例化、方法留给子类实现
synchronized同步,多线程下保证方法互斥访问
volatile易变,多线程间保证变量可见性
transient瞬态,序列化时忽略该字段

static 变量与方法

static 成员属于类本身:直接用类名调用,无需创建对象,并且所有对象共享同一份:

class Counter {
    static int total = 0;  // 静态变量,所有对象共享

    Counter() {
        total++;           // 每 new 一次加 1
    }

    static void show() {   // 静态方法
        System.out.println("总对象数:" + total);
    }
}

public class TestStatic {
    public static void main(String[] args) {
        new Counter();
        new Counter();
        Counter.show();    // 类名直接调用静态方法
    }
}
// 输出:总对象数:2

注意:静态方法里不能直接访问非静态成员,因为它不依赖某个具体对象。

final 的三种用途

  • final 类:不能被继承,如 String;
  • final 方法:不能被子类重写;
  • final 变量:赋值后不可再改。
public class FinalDemo {
    static final int MAX = 100;  // final 变量,常配合 static 做常量

    public static void main(String[] args) {
        // MAX = 200;            // 编译错误:final 变量不能重新赋值
        System.out.println(MAX); // 输出:100
    }
}

修饰符组合常见写法

修饰符常组合使用,顺序无强制要求,习惯写法如下(片段需放进类的定义中):

public static final double PI = 3.14159;    // 公开常量
private static int count = 0;               // 私有静态变量
public synchronized void save() { }         // 同步方法
public abstract class Shape { }             // 抽象类

访问修饰符管「谁能用」,非访问修饰符管「怎么用」:private 封装细节、public 暴露接口、static 归属类、final 不可变,组合使用即可写出规范的 Java 代码。

笔记加载中…