📅  最后修改于: 2023-12-03 15:40:16.858000             🧑  作者: Mango
在Java中,有三种常见的非访问修饰符:最终、静态和抽象。这些修饰符可以用来控制类和变量的行为和属性。在本文中,我们将深入了解这三个关键字的含义、用法和区别。
最终是一个非常有用的关键字,它用来防止子类修改类、方法或变量。最终可以用来禁止继承、禁止方法覆盖以及禁止变量的重新赋值。最终也可以用来确保在多线程环境下,变量在被初始化之后不能被修改。
最终可以用来禁止类被继承。例如:
final class MyClass {
// ...
}
class SubClass extends MyClass { // 编译错误,无法继承最终类
// ...
}
最终也可以用来禁止方法被子类覆盖。例如:
class MyClass {
final void myMethod() {
// ...
}
}
class SubClass extends MyClass {
void myMethod() { // 编译错误,无法覆盖最终方法
// ...
}
}
最终还可以用来禁止变量在初始化之后被重新赋值。例如:
final int x = 1;
x = 2; // 编译错误,无法重新赋值最终变量
最终还可以用来确保变量在被初始化之后不能被修改,即便在多线程环境下也是如此。例如:
class MyClass {
private final int x;
public MyClass(int x) {
this.x = x;
}
public int getX() {
return this.x;
}
}
在这个示例中,x是被声明为最终变量,并且只在构造函数中初始化。由于x是最终变量,我们可以确保它在被初始化之后不会被修改。另外一点需要注意的是,由于只有在被初始化之后才能使用x,因此x必须是私有的,否则子类可以在构造函数之外修改x的值。
静态是另一个常见的关键字,它可以用来创建类级别的变量和方法。静态变量和方法可以在类初始化之前就被使用,并且所有实例对象共享相同的静态变量和方法。
要创建一个静态变量,我们可以在变量前面添加static关键字。例如:
class MyClass {
static int x;
public void setX(int x) {
MyClass.x = x;
}
public int getX() {
return MyClass.x;
}
}
在这个示例中,我们创建了一个静态变量x,并且定义了两个方法来读取和修改x的值。由于x是静态变量,所以它可以在类初始化之前就被使用,并且所有实例对象共享相同的x变量。
要创建一个静态方法,我们只需要在方法前面添加static关键字。例如:
class MyClass {
static int x;
public static void myStaticMethod() {
// ...
}
}
在这个示例中,我们创建了一个静态方法myStaticMethod。由于myStaticMethod是静态方法,因此可以在类初始化之前就被使用。
抽象是用来创建抽象类和抽象方法的关键字。抽象类是不能被实例化的类,而抽象方法是没有实现的方法。抽象类一般用来定义一个接口,而由具体实现继承来完成。
要创建一个抽象类,我们可以在类前面添加abstract关键字。例如:
abstract class MyAbstractClass {
// ...
}
在这个示例中,我们创建了一个抽象类MyAbstractClass。由于MyAbstractClass是抽象类,因此它不能被实例化。
要创建一个抽象方法,我们只需要在方法前面添加abstract关键字。例如:
abstract class MyAbstractClass {
abstract void myAbstractMethod();
}
在这个示例中,我们创建了一个抽象方法myAbstractMethod。由于myAbstractMethod是抽象方法,因此它没有实现。抽象方法只是定义了方法的接口,并没有提供具体的实现。具体的实现由由具体实现继承来完成。
最终、静态和抽象是三个非常有用的非访问修饰符。最终可以用来防止子类修改类、方法或变量,静态可以用来创建类级别的变量和方法,并且所有实例对象共享相同的静态变量和方法,抽象可以用来创建抽象类和抽象方法,由具体实现继承来完成。熟悉这些非访问修饰符的使用,有助于构建可维护、高效、易于扩展的Java程序。