📜  最终 vs 静态 vs 抽象非访问修饰符(1)

📅  最后修改于: 2023-12-03 15:40:16.858000             🧑  作者: Mango

最终 vs 静态 vs 抽象非访问修饰符

在Java中,有三种常见的非访问修饰符:最终、静态和抽象。这些修饰符可以用来控制类和变量的行为和属性。在本文中,我们将深入了解这三个关键字的含义、用法和区别。

最终(Final)

最终是一个非常有用的关键字,它用来防止子类修改类、方法或变量。最终可以用来禁止继承、禁止方法覆盖以及禁止变量的重新赋值。最终也可以用来确保在多线程环境下,变量在被初始化之后不能被修改。

禁止继承

最终可以用来禁止类被继承。例如:

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)

静态是另一个常见的关键字,它可以用来创建类级别的变量和方法。静态变量和方法可以在类初始化之前就被使用,并且所有实例对象共享相同的静态变量和方法。

创建静态变量

要创建一个静态变量,我们可以在变量前面添加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关键字。例如:

abstract class MyAbstractClass {
    // ...
}

在这个示例中,我们创建了一个抽象类MyAbstractClass。由于MyAbstractClass是抽象类,因此它不能被实例化。

创建抽象方法

要创建一个抽象方法,我们只需要在方法前面添加abstract关键字。例如:

abstract class MyAbstractClass {
    abstract void myAbstractMethod();
}

在这个示例中,我们创建了一个抽象方法myAbstractMethod。由于myAbstractMethod是抽象方法,因此它没有实现。抽象方法只是定义了方法的接口,并没有提供具体的实现。具体的实现由由具体实现继承来完成。

总结

最终、静态和抽象是三个非常有用的非访问修饰符。最终可以用来防止子类修改类、方法或变量,静态可以用来创建类级别的变量和方法,并且所有实例对象共享相同的静态变量和方法,抽象可以用来创建抽象类和抽象方法,由具体实现继承来完成。熟悉这些非访问修饰符的使用,有助于构建可维护、高效、易于扩展的Java程序。