欢迎访问电脑基础技术网
专注于电脑基础教程相关技术编程技术入门基础与网络基础技术的教学
合作联系QQ2707014640
您的位置: 首页>>技术基础>>正文
技术基础

Java修饰符大乱斗,从门卫到国王的权限游戏

时间:2025-08-05 作者:电脑基础 点击:6240次

,---,Java修饰符大乱斗,从门卫到国王的权限游戏,在Java编程的王国里,修饰符扮演着至关重要的角色,它们像是一套精密的权限控制系统,定义着代码的可见性、行为和生命周期,想象一下,从至高无上的“国王”到只负责看门的“门卫”,Java修饰符提供了多种“头衔”和“权限级别”。访问控制修饰符(public, protected, private)是权限游戏的核心,它们决定了类、方法或变量能被哪些范围的代码访问,严格管理着内部成员的可见性,是封装原则的基石,然后是非访问修饰符,如final,它像一道坚固的门,一旦声明类、方法或变量为final,便能防止被覆盖或赋值,赋予其不可变的特性,确保安全与稳定,abstract则像是一个未完成的契约,声明一个类无法被实例化,但要求其子类必须实现特定的方法,用于构建框架和接口,还有static,它允许在不依赖类实例的情况下访问变量或方法,实现与类关联而非对象关联的功能,以及transientvolatile,它们则分别在序列化和多线程环境下规定特殊的行为。理解并恰当运用这些修饰符,就像是掌握了一套复杂的规则,能够精确地控制代码的“权限”,构建出结构清晰、安全可靠的面向对象程序,它们共同构成了Java语言中关于访问、继承、抽象和状态管理的核心语法,是每个Java开发者必须熟练掌握的基础技能。

本文目录导读:

  1. 访问修饰符:控制谁可以进入你的“领地”
  2. 非访问修饰符:赋予成员“超能力”
  3. 返回值修饰符:throws vs throw
  4. 总结:修饰符的“江湖地位”
  5. Java修饰符的种类
  6. Java修饰符的运用场景
  7. Java修饰符的注意事项

访问修饰符:控制谁可以进入你的“领地”

在Java中,访问修饰符就像是一个门卫,决定着谁可以进入你的类、方法或变量的“领地”,Java提供了四种访问修饰符,它们分别是:

  1. public:公共的,谁都可以进!
  2. protected:受保护的,本类、同包、子类可以进。
  3. private:私有的,只有本类能进。
  4. 默认(什么都不写):默认的,同包可以进。

表格:访问修饰符对比

修饰符 类内部 同一个包 子类 其他包
public
protected
private
默认

案例演示

假设我们有一个Student类,定义在com.school包下:

Java修饰符大乱斗,从门卫到国王的权限游戏

// Student.java
public class Student {
    public String name; // 公共属性,谁都能看
    protected int age;  // 受保护属性,子类也能看
    private String id;  // 私有属性,只有本类能访问
    public void study() { // 公共方法
        System.out.println("Public method: Studying...");
    }
}

如果我们在另一个包com.university下创建一个GraduateStudent类,继承自Student

// GraduateStudent.java
package com.university;
import com.school.Student;
public class GraduateStudent extends Student {
    public void graduate() {
        // 这里可以访问protected的age吗?
        System.out.println("Age: " + age); // ✅ 可以访问
    }
}

问答时间

Q:protected和默认有什么区别?
A:protected修饰的成员不仅同包可以访问,子类在不同包也能访问;而默认修饰符(什么都不写)只允许同包访问,子类即使继承也无法访问。

Q:private修饰符能用于类吗?
A:不能!private只能用于类内部的成员(字段、方法、内部类等),不能用于修饰整个类。


非访问修饰符:赋予成员“超能力”

除了访问修饰符,Java还有一堆非访问修饰符,它们可以单独使用,赋予类、方法或变量一些特殊的能力,这些修饰符包括:

final

  • :不能被继承。
  • 方法:不能被重写。
  • 变量:一旦赋值,不能再改变(常量)。

案例:

// 常量示例
public class Constants {
    public static final double PI = 3.14159;
}
// 不可继承的类
public final class Utility {
    // 方法不能重写
    public final void doSomething() {
        System.out.println("This is final method.");
    }
}

abstract

  • :不能被实例化,必须被继承。
  • 方法:只有声明,没有实现,必须被重写。

案例:

// 抽象类
public abstract class Animal {
    public abstract void makeSound(); // 抽象方法
    public void sleep() {
        System.out.println("Zzz...");
    }
}
// 实现抽象类
public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Woof!");
    }
}

static

  • 类变量/方法:属于类而不是实例,共享同一个副本。
  • 代码块:用于初始化静态变量。

案例:

public class Counter {
    private static int count = 0; // 静态变量
    public Counter() {
        count++; // 每次创建实例,count加1
    }
    public static void printCount() {
        System.out.println("Total instances: " + count);
    }
}

synchronized

  • 用于多线程,确保同一时间只有一个线程访问方法或代码块。

案例:

public class BankAccount {
    private double balance;
    public synchronized void deposit(double amount) {
        balance += amount;
    }
    public synchronized void withdraw(double amount) {
        balance -= amount;
    }
}

transient

  • 用于变量,表示在序列化时忽略该字段。

案例:

public class User implements Serializable {
    private String name;
    private transient String password; // 密码不会被序列化
    // ...
}

volatile

  • 用于变量,确保多线程环境下变量的可见性,禁止指令重排序。

案例:

public class Flag {
    private volatile boolean running = true;
    public void run() {
        while (running) {
            // ...
        }
    }
    public void stop() {
        running = false;
    }
}

表格:非访问修饰符总结

修饰符 适用范围 主要作用
final 类、方法、变量 不可继承、不可重写、常量
abstract 类、方法 抽象类、抽象方法
static 类变量、方法、代码块 属于类,共享
synchronized 方法、代码块 线程同步
transient 变量 序列化时忽略
volatile 变量 线程可见性,禁止重排序

返回值修饰符:throws vs throw

你可能听说过throwsthrow,它们虽然看起来有点像,但作用完全不同:

  • throws:用于方法声明,表示方法可能抛出异常,调用者需要处理。
  • throw:用于方法体中,手动抛出一个异常实例。

案例:

// throws示例
public class Validator {
    public void validate(int value) throws IllegalArgumentException {
        if (value < 0) {
            throw new IllegalArgumentException("Value cannot be negative");
        }
    }
}
// throw示例
public class Calculator {
    public int divide(int a, int b) throws ArithmeticException {
        if (b == 0) {
            throw new ArithmeticException("Division by zero");
        }
        return a / b;
    }
}

修饰符的“江湖地位”

Java修饰符就像是一个等级森严的王国,每个修饰符都有自己的“身份”和“权限”,合理使用它们,你的代码将更加健壮、安全、可维护;滥用它们,可能会让你的代码陷入混乱。

  • public是万能钥匙,但别随便给谁都开门。
  • private是你的堡垒,保护核心逻辑不被窥探。
  • final是不可更改的誓言,一旦承诺就不能反悔。
  • abstract是未完成的乐章,需要有人来续写。
  • static是共享的资源,小心别让所有人都来抢夺。

知识扩展阅读

Java修饰符大乱斗,从门卫到国王的权限游戏

在Java编程的世界里,修饰符就像是我们的小工具箱,它们能让我们更加灵活地控制类、方法和属性的访问权限,就让我带你一起走进Java修饰符的奇妙世界,看看这些小工具是如何帮助我们编写出更加完美代码的吧!

Java修饰符的种类

我们来了解一下Java中常见的修饰符有哪些,Java一共提供了7种修饰符,它们分别是:

  1. public:公共访问级别,表示该成员可以被任何类访问。
  2. protected:受保护访问级别,表示该成员可以被同一个包内的类和所有子类访问。
  3. private:私有访问级别,表示该成员只能被定义它的类访问。
  4. default(没有修饰符):默认访问级别,也称为包访问级别,表示该成员可以被同一个包内的类访问。
  5. static:静态修饰符,用于声明静态成员或方法。
  6. final:最终修饰符,用于声明不可变的类、方法或变量。
  7. abstract:抽象修饰符,用于声明抽象类或抽象方法。

我们通过一个简单的例子来了解这些修饰符的具体用法。(因为没有指定访问级别,默认为包访问)

// 定义一个公共类
public class PublicClass {
    // 公共成员
    public int publicVar = 1;
    // 受保护成员
    protected int protectedVar = 2;
    // 私有成员
    private int privateVar = 3;
    // 默认访问级别成员
    int defaultVar = 4;
    // 静态成员
    public static int staticVar = 5;
    // 最终成员
    final int finalVar = 6;
    // 抽象成员
    abstract void abstractMethod();
}

Java修饰符的运用场景

我们来聊聊这些修饰符在哪些场景下会派上用场。

访问控制

访问控制是Java修饰符最常用的场景之一,通过使用不同的访问级别,我们可以精确地控制类、方法和属性的可见性。

  • public:当你希望一个类、方法或属性可以被任何其他类访问时,可以使用public修饰符。
  • protected:当你希望一个方法或属性可以被同一个包内的类和所有子类访问时,可以使用protected修饰符。
  • private:当你希望一个成员只能被定义它的类访问时,可以使用private修饰符。
  • default(包访问):当你希望一个成员可以被同一个包内的类访问时,不需要使用任何修饰符,默认为包访问级别。

案例1:假设我们有一个Person类,我们希望其中的name属性只能被Person类本身访问,我们可以将其声明为private

public class Person {
    private String name; // 私有属性
    public String getName() { // 公共方法,用于获取name属性的值
        return name;
    }
    public void setName(String name) { // 公共方法,用于设置name属性的值
        this.name = name;
    }
}

案例2:假设我们有一个Student类和一个Teacher类,我们希望Student类可以访问Teacher类的name属性和方法,但Teacher类和其他包中的类不能访问,我们可以使用protected修饰符。

// Teacher.java
package com.example;
public class Teacher {
    protected String name; // 受保护属性
    public void teach() {
        System.out.println("Teaching...");
    }
}
// Student.java
package com.example.student;
import com.example.Teacher;
public class Student extends Teacher {
    public void study() {
        System.out.println("Studying...");
    }
    public void accessName() { // 学生可以访问父类的受保护属性
        System.out.println("Name: " + name);
    }
}

内部类和匿名内部类

在Java中,我们还可以使用staticfinalabstract等修饰符来定义内部类和匿名内部类。

  • static:静态内部类或静态方法属于外部类,而不是外部类的实例。
  • final:最终内部类或最终方法不能被继承或重写。
  • abstract:抽象内部类或抽象方法只有声明没有实现。

案例3:假设我们有一个Logger类,我们希望创建一个静态的日志记录器实例,可以使用static修饰符。

public class Logger {
    private static Logger instance; // 静态私有变量
    private Logger() {} // 私有构造函数
    public static Logger getInstance() { // 公共静态方法,用于获取Logger实例
        if (instance == null) {
            instance = new Logger();
        }
        return instance;
    }
    public void log(String message) { // 日志记录方法
        System.out.println("Log: " + message);
    }
}

Java修饰符的注意事项

在使用Java修饰符时,我们还需要注意以下几点:

  1. 访问级别顺序:Java中访问级别的顺序是:private < default < protected < public,在设计类时,我们应该合理地安排访问级别,以确保代码的安全性和可维护性。
  2. 继承和覆盖:对于继承关系中的子类,它可以访问父类的protected成员;对于接口中的方法,实现类必须提供具体的实现,不能使用abstract修饰符。
  3. final类和方法:使用final修饰符可以防止类被继承或方法被重写,这在设计不可变类或方法时非常有用。

通过本文的介绍,相信你对Java修饰符有了更深入的了解,掌握这些修饰符的使用方法和注意事项,将有助于你编写出更加安全、可维护和高效的Java代码,你已经准备好成为Java编程达人了吗?让我们一起踏上编程之旅吧!

相关的知识点: