跳转至

Java 中的访问修饰符:public、private 和 protected

简介

在 Java 编程语言中,访问修饰符是用于控制类、变量、方法和构造函数的访问级别。publicprivateprotected 是最常用的访问修饰符。理解这些修饰符对于编写安全、可维护且结构良好的代码至关重要。它们可以帮助我们隐藏实现细节,保护数据,并确保类与类之间的正确交互。

目录

  1. 基础概念
    • public 修饰符
    • private 修饰符
    • protected 修饰符
  2. 使用方法
    • 修饰类
    • 修饰变量
    • 修饰方法
    • 修饰构造函数
  3. 常见实践
    • 封装数据
    • 控制类之间的交互
  4. 最佳实践
    • 最小化访问权限
    • 合理使用 protected
  5. 小结
  6. 参考资料

基础概念

public 修饰符

public 修饰符表示被修饰的元素(类、变量、方法、构造函数)对所有其他类都是可见的,没有任何访问限制。任何类都可以访问 public 元素。

private 修饰符

private 修饰符意味着被修饰的元素只能在定义它的类内部被访问。这是用于隐藏类的实现细节和保护数据的机制。其他类无法直接访问 private 元素。

protected 修饰符

protected 修饰符提供了比 private 更宽松的访问级别。被 protected 修饰的元素可以在定义它的类内部、同一个包中的其他类以及不同包中的子类访问。

使用方法

修饰类

  • public:一个类可以被声明为 public,这意味着它可以被任何其他类访问。例如:
public class PublicClass {
    // 类的成员
}
  • private:类不能直接被声明为 private。顶级类只能是 public 或包级访问(默认)。然而,内部类可以是 private。例如:
public class OuterClass {
    private class InnerClass {
        // 内部类的成员
    }
}
  • protected:顶级类不能被声明为 protected,只有内部类可以。

修饰变量

  • public 变量:可以从任何地方访问。
public class PublicVariableExample {
    public int publicVariable;
}
  • private 变量:只能在定义它的类内部访问。
public class PrivateVariableExample {
    private int privateVariable;

    public void setPrivateVariable(int value) {
        this.privateVariable = value;
    }

    public int getPrivateVariable() {
        return this.privateVariable;
    }
}
  • protected 变量:在同一包中的类和不同包中的子类可以访问。
package com.example;

public class ProtectedVariableExample {
    protected int protectedVariable;
}

修饰方法

  • public 方法:可从任何类访问。
public class PublicMethodExample {
    public void publicMethod() {
        System.out.println("This is a public method.");
    }
}
  • private 方法:只能在定义它的类内部调用。
public class PrivateMethodExample {
    private void privateMethod() {
        System.out.println("This is a private method.");
    }

    public void callPrivateMethod() {
        privateMethod();
    }
}
  • protected 方法:在同一包中的类和不同包中的子类可以调用。
package com.example;

public class ProtectedMethodExample {
    protected void protectedMethod() {
        System.out.println("This is a protected method.");
    }
}

修饰构造函数

  • public 构造函数:任何类都可以创建该类的实例。
public class PublicConstructorExample {
    public PublicConstructorExample() {
        System.out.println("Public constructor called.");
    }
}
  • private 构造函数:阻止其他类创建该类的实例,常用于单例模式。
public class PrivateConstructorExample {
    private static PrivateConstructorExample instance;

    private PrivateConstructorExample() {
    }

    public static PrivateConstructorExample getInstance() {
        if (instance == null) {
            instance = new PrivateConstructorExample();
        }
        return instance;
    }
}
  • protected 构造函数:同一包中的类和不同包中的子类可以创建实例。
package com.example;

public class ProtectedConstructorExample {
    protected ProtectedConstructorExample() {
        System.out.println("Protected constructor called.");
    }
}

常见实践

封装数据

使用 private 修饰符将类的成员变量封装起来,通过 publicgettersetter 方法来访问和修改这些变量。这样可以保护数据的完整性,并且在需要时可以在 gettersetter 方法中添加额外的逻辑。

控制类之间的交互

通过合理使用访问修饰符,可以控制不同类之间的交互。例如,将一些内部方法声明为 private,防止外部类调用,只暴露必要的 public 方法作为接口,从而降低类之间的耦合度。

最佳实践

最小化访问权限

尽可能将类、变量和方法的访问权限设置为最小。只有当确实需要其他类访问时,才将其声明为更宽松的访问级别。这样可以提高代码的安全性和可维护性。

合理使用 protected

protected 修饰符应该谨慎使用。通常,只有在设计类层次结构并且希望子类能够访问某些成员时才使用它。避免过度使用 protected,以免破坏封装性。

小结

publicprivateprotected 访问修饰符在 Java 中扮演着重要的角色。public 用于完全公开的元素,private 用于隐藏实现细节,protected 用于在类层次结构和包之间提供特定的访问控制。通过正确使用这些修饰符,可以实现数据封装、控制类之间的交互,并遵循良好的编程实践,从而编写出高质量、易于维护的 Java 代码。

参考资料