Java 修饰符

修饰符

到目前为止,您已经非常熟悉几乎所有示例中出现的 public 关键字:

  1. public class Main

public 关键字是一个 访问修饰符,这意味着它用于设置类、属性、方法和构造函数的访问级别.

我们把修饰符分成两组:

  • 访问修饰符函数 - 控制访问级别
  • 非访问修饰符函数 - 不控制访问级别,但提供其他功能

访问修饰符

对于 ,可以使用 publicdefault:

修饰符描述试一试
public任何其他类都可以访问该类试一试 »
default只有同一个包中的类才能访问该类.这在您不指定修饰符时使用.您将在 java 包 一章中了解有关包的更多信息试一试 »

对于 属性、方法和构造函数,可以使用以下方法之一:

修饰符描述试一试
public所有类都可以访问该代码试一试 »
private代码只能在声明的类中访问试一试 »
default代码只能在同一个包中访问.这在您不指定修饰符时使用.您将在 java 包 一章中了解有关包的更多信息试一试 »
protected代码可以在相同的包和 子类 中访问.在 Java 继承 一章中,您将了解更多关于子类和超类的信息试一试 »

非访问修饰符

对于 , 可以使用 finalabstract:

修饰符描述试一试
final该类不能被其他类继承(您将在 Java 继承 一章中了解有关继承的更多信息)试一试 »
abstract该类不能用于创建对象(要访问抽象类,必须从另一个类继承)。试一试 »

对于 属性和方法,可以使用以下方法之一:

修饰符描述
final无法覆盖/修改属性和方法
static属性和方法属于类,而不是对象
abstract只能用于抽象类,也只能用于方法。例如,该方法没有主体 abstract void run();. 主体由子类(继承)提供。在继承抽象章节中,您将学习到有关继承和抽象的更多信息
transient序列化包含属性和方法的对象时,将跳过这些属性和方法
synchronized方法一次只能由一个线程访问
volatile属性的值不是本地缓存的,总是从 "主存" 中读取

Final

如果不想覆盖现有属性值,请将属性声明为 final:

实例
  1. public class Main {
  2. final int x = 10;
  3. final double PI = 3.14;
  4. public static void main(String[] args) {
  5. Main myObj = new Main();
  6. myObj.x = 50;
  7. myObj.PI = 25;
  8. System.out.println(myObj.x);
  9. }
  10. }

Static

static 静态方法意味着它可以在不创建类的对象的情况下被访问,这与 public 不同:

实例

一个演示 static 方法和 public 方法之间差异的实例:

  1. public class Main {
  2. // Static method
  3. static void myStaticMethod() {
  4. System.out.println("You can call static methods without creating objects");
  5. }
  6. // Public method
  7. public void myPublicMethod() {
  8. System.out.println("Public methods must be called by creating objects");
  9. }
  10. // Main method
  11. public static void main(String[] args) {
  12. myStaticMethod();
  13. Main myObj = new Main();
  14. myObj.myPublicMethod();
  15. }
  16. }

Abstract

abstract 抽象方法属于 abstract 抽象类,并且没有主体。主体由子类提供:

实例
  1. // abstract class
  2. abstract class Main {
  3. public String fname = "John";
  4. public int age = 24;
  5. public abstract void study();
  6. }
  7. // Subclass (inherit from Main)
  8. class Student extends Main {
  9. public int graduationYear = 2022;
  10. public void study() {
  11. System.out.println("Studying all day long");
  12. }
  13. }