最适合网络开发者的网站
Java 编程语言。初学者课程

尿素

Java 修饰符


修饰符

现在你已经非常熟悉了 public 几乎在所有示例中都出现的关键字:

public class Main

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

我们将修饰符分为两类:

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

访问修饰符

为了 ,你可以使用它 public 或者默认:

修改器 描述 尝试一下
public 该类可以被任何其他类访问 尝试一下 ”
默认 该类只能由同一包中的类访问。这在您未指定修饰符时使用。您将在 软件包章节 尝试一下 ”

为了 属性、方法和构造函数,您可以使用下列方法之一:

修改器 描述 尝试一下
public 该代码可供所有班级使用 尝试一下 ”
private 该代码只能在声明的类中访问 尝试一下 ”
默认 代码只能在同一个包中访问。这在您未指定修饰符时使用。您将在 软件包章节 尝试一下 ”
protected 代码可以在同一个包中访问,并且 子类您将在 传承篇 尝试一下 ”

非访问修饰符

为了 ,你可以使用它 final 或者abstract:

修改器 描述 尝试一下
final 该类不能被其他类继承(您将在 传承篇) 尝试一下 ”
abstract 该类不能用于创建对象(要访问抽象类,必须从另一个类继承。您将在 遗产抽象 章节) 尝试一下 ”

为了 属性和方法,您可以使用下列方法之一:

修改器 描述
final 属性和方法不能被覆盖/修改
static 属性和方法属于类,而不是对象
abstract 只能在抽象类中使用,并且只能在方法上使用。方法没有主体,例如 抽象void运行();。主体由子类(继承自)提供。您将在 遗产抽象 章节
transient 序列化包含属性和方法的对象时,会跳过这些属性和方法
synchronized 每次只能由一个线程访问方法
volatile 属性的值不在线程本地缓存,而是始终从“主内存”读取

最终的

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

例子

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

  public static void main(String[] args) {
    Main myObj = new Main();
    myObj.x = 50; // will generate an error: cannot assign a value to a final variable
    myObj.PI = 25; // will generate an error: cannot assign a value to a final variable
    System.out.println(myObj.x);
  }
}
亲自尝试 »

静止的

A static 方法意味着无需创建类的对象即可访问它,与public:

例子

举个例子来说明 staticpublic 方法:

public class Main {
  // Static method
  static void myStaticMethod() {
    System.out.println("Static methods can be called without creating objects");
  }

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

  // Main method
  public static void main(String[ ] args) {
    myStaticMethod(); // Call the static method
    // myPublicMethod(); This would output an error

    Main myObj = new Main(); // Create an object of Main
    myObj.myPublicMethod(); // Call the public method
  }
}
亲自尝试 »

抽象的

一个 abstract 方法属于abstract 类,并且它没有主体。主体由子类提供:

例子

// Code from filename: Main.java
// abstract class
abstract class Main {   public String fname = "John";   public int age = 24;   public abstract void study(); // abstract method } // Subclass (inherit from Main) class Student extends Main {   public int graduationYear = 2018;   public void study() { // the body of the abstract method is provided here     System.out.println("Studying all day long");   } } // End code from filename: Main.java // Code from filename: Second.java class Second {   public static void main(String[] args) {     // create an object of the Student class (which inherits attributes and methods from Main)     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(); // call abstract method
  } }
亲自尝试 »