Java中的public、protected、private和包级私有:全面解析

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Java访问修饰符隐藏了什么?深入理解封装

\n\n

每个刚开始学习Java的人,都会在字段和方法前遇到神秘的public、private和protected关键字。但它们到底意味着什么?为什么不能把所有东西都设为public然后高枕无忧?还有那个大多数教程都避而不谈的神秘包级私有又是什么?

\n\n

在本文中,我们将通过真实的代码示例,深入解析Java中public、protected、包级私有和private之间的区别。您将了解每个修饰符的工作原理、在什么情况下使用它们,以及为什么正确选择访问修饰符是良好架构思维的标志。让我们开始吧!

\n\n

为什么需要访问修饰符?

\n\n

想象一下您在建造一所房子。您有入口门(所有人都可以进入)、客房(朋友可以进入)、私人书房(仅限家人进入)和保险箱(仅限您自己进入)。Java中的访问修饰符工作原理完全相同:它们定义了谁可以“进入”您的类、方法或字段。

\n\n

主要目的是封装。我们隐藏类的内部实现细节,只对外暴露真正需要的内容。这可以保护数据免受意外修改,并简化代码维护。

\n\n

四种访问级别的快速概览

\n\n

Java中有四种访问级别(从最严格到最开放):

\n\n
    \n
  • private — 仅在类内部可访问
  • \n
  • 包级私有(默认) — 在类内部和包内可访问
  • \n
  • protected — 类 + 包 + 子类
  • \n
  • public — 随处可访问
  • \n
\n\n

Private:“我的,谁也别碰”

\n\n

private修饰符是最严格的。标记为private的字段或方法仅在同一类内部可访问。无论是子类还是同一包中的类,都无法访问它。

\n\n
public class BankAccount {\n    private double balance;  // 仅在类内部可访问\n\n    public BankAccount(double initialBalance) {\n        this.balance = initialBalance;\n    }\n\n    public void deposit(double amount) {\n        if (amount > 0) {\n            balance += amount;\n        }\n    }\n\n    // 此方法可以访问private字段,因为它位于类内部\n    public double getBalance() {\n        return balance;\n    }\n}\n\npublic class Main {\n    public static void main(String[] args) {\n        BankAccount account = new BankAccount(1000);\n        // account.balance = 5000;  // 编译错误!balance是private\n        System.out.println(account.getBalance());  // 通过公有方法正常工作\n    }\n}
\n\n

何时使用: 用于不应从外部修改的类内部数据(例如计数器、对象的内部状态)。

\n\n

包级私有(默认):“安静的邻居”

\n\n

如果您没有指定任何修饰符,Java会自动将访问权限设为包级私有。这意味着字段或方法对同一包内的所有类可见,但在包外不可见。

\n\n
package com.pythonlib.utils;\n\nclass Helper {  // 包级私有类(无修饰符)\n    String secretMessage = "仅在包内可见";  // 包级私有字段\n\n    void displayMessage() {  // 包级私有方法\n        System.out.println(secretMessage);\n    }\n}\n\npackage com.pythonlib.app;\n\nimport com.pythonlib.utils.Helper;\n\npublic class App {\n    public static void main(String[] args) {\n        Helper helper = new Helper();\n        // helper.secretMessage = "错误!";  // 不可见 — 不同包\n        // helper.displayMessage();  // 编译错误\n    }\n}
\n\n

何时使用: 用于辅助类

博客

书籍推荐