Java 修饰符

创建于 2024-12-02 / 26
字体: [默认] [大] [更大]

修饰符

现在,您已经非常熟悉我们几乎所有示例中出现的public关键字:

public class MyClass

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

我们将修饰符分为两组:

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

访问修饰符

对于 classes,可以使用 publicdefault:

修饰符 描述 试一试
public 该类可由任何其他类访问 试一试 »
default 该类只能由同一包中的类访问。在不指定修改器时使用此选项。您将在" Packages"一章中了解有关软件包的更多信息 试一试 »

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

修饰符 描述 试一试
public 所有类都可以访问该代码 试一试 »-->
private 代码只能在声明的类中访问 试一试 »
default 该类只能由同一包中的类访问。在不指定修改器时使用此选项。您将在" Packages"一章中了解有关软件包的更多信息 试一试 »
protected 代码可以在相同的包和子类中访问。在 继承一章中,您将了解有关子类和超类的更多信息 试一试 »

非访问修饰符

对于,可以使用finalabstract:

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

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

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

Advertisement

-->

Final

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

实例

public class MyClass {
  final int x = 10;
  final double PI = 3.14;

  public static void main(String[] args) {
    MyClass myObj = new MyClass();
    myObj.x = 50; // 将产生错误:无法为 final 变量赋值
    myObj.PI = 25; // 将产生错误:无法为 final 变量赋值
    System.out.println(myObj.x);
  }
}

运行实例 »


Static

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

实例

演示staticpublic方法之间差异的示例:

public class MyClass {
  // 静态方法
  static void myStaticMethod() {
    System.out.println("Static methods can be called without creating objects");
  }

  // 公共方法
  public void myPublicMethod() {
    System.out.println("Public methods must be called by creating objects");
  }

  // Main 方法
  public static void main(String[ ] args) {
    myStaticMethod(); // 调用静态方法
    // myPublicMethod(); 这将输出错误

    MyClass myObj = new MyClass(); // 创建一个 MyClass 的对象
    myObj.myPublicMethod(); // 调用公共方法
  }
}

运行实例 »


Abstract

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

实例

// Code from filename: Person.java
// 抽象类
abstract class Person {   public String fname = "John";   public int age = 24;   public abstract void study(); // 抽象方法 } // 子类(从 Person 继承) class Student extends Person {   public int graduationYear = 2018;   public void study() { // 此处提供了抽象方法的主体     System.out.println("Studying all day long");   } } // End code from filename: Person.java // Code from filename: MyClass.java class MyClass {   public static void main(String[] args) {     // 创建 Student 类的对象(从 Person 继承属性和方法)     Student myObj = new Student();     System.out.println("Name: " + myObj.fname);     System.out.println("Age: " + myObj.age);     System.out.println("Graduation Year: " + myObj.graduationYear);     myObj.study(); // 调用抽象方法
  } }

运行实例 »-->



0 人点赞过