在Java中,static 和final 修饰符都是非访问修饰符,可以修改你定义的实体的行为方式。
虽然都是非访问修改器关键字,但static 和final 关键字的用途不同。
本教程将帮助你学习这两个关键字的区别,从static 关键字开始。
Java静态修改器解释
static 关键字用于定义具有静态性质的类、变量、方法或块。
class 的静态变量和方法可以被访问,而不需要创建该class 的实例。
在下面的例子中,Helper 类有一个静态变量name 和一个静态方法hello():
class Helper {
static String name = "Nathan";
static void hello() {
System.out.println("Hello World!");
}
}
因为name 和hello() 都是静态的,你可以调用它们而不需要创建Helper 类的实例。
下面的代码就可以正常工作了:
class Main {
public static void main(String[] args) {
System.out.println(Helper.name); // Nathan
Helper.hello(); // Hello World!
Helper helper = new Helper(); // create an instance of helper
System.out.println(helper.name); // Nathan
}
}
从上面的例子可以看出,你仍然可以创建一个Helper 类的实例,并可以很好地访问其成员。
但如果你使用的是像Android Studio或IntelliJ这样的IDE,建议你直接访问类中的成员。
static 变量的值是可以改变的,你也可以声明一个变量而不初始化它:
class Main {
public static void main(String[] args) {
Helper.name = "John Doe";
Helper.age = 29;
}
}
class Helper {
static String name = "Nathan";
static int age;
}
而且static 方法可以被重写:
class Helper {
static String name = "Nathan";
static void hello() {
System.out.println("Hello World!");
}
}
class Speak extends Helper {
// Override hello() method
static void hello(String name){
System.out.println("Hi! My name is "+ name);
}
}
你也可以使用static 修改器创建一个嵌套类:
class Main {
public static void main(String[] args) {
System.out.println(Author.name);
}
static class Author {
static String name = "Nathan";
}
}
如果没有static 修饰符,内层类Author 类就不能有静态成员。
最后,你还可以写一个static 块,如下所示:
class Main {
public static void main(String[] args) {
System.out.println("Main block output");
}
static {
System.out.println("Static block output");
}
static {
System.out.println("Static block output 2");
}
}
当你运行上面的Main 类时,生成的输出将如下。
Static block output
Main block output
注意,输出的顺序是相反的。static 块的输出被打印在main 块之前。
这是因为static 块在加载class 时就被执行。
你可以在一个Javaclass 中添加你需要的任意数量的static 块。
总结一下,static 修改器关键字可以用来创建四个实体:
static变量static方法static嵌套类- 和
static块
现在你已经了解了static 关键字,接下来让我们了解一下final 关键字。
Java final修饰语解释
Java中的final 修饰符是用来创建一个最终或固定性质的实体。
这意味着实体的值或定义在初始化后不能被改变。
例如,你可以创建一个具有固定部落和属种规格的Human 类:
class Human {
final String tribe = "Hominini";
final String genus = "Homo";
String name = "Nathan";
}
你不能从class 实例中改变任何final 的变量,如下图所示:
class Main {
public static void main(String[] args) {
Human person = new Human();
person.tribe = "Panina"; // Error can't assign to static variable
person.name = "Jack"; // OK
}
}
一个final 方法不能被重写,一个final 类不能被另一个类所扩展。
另外,在创建一个块时,你不能使用final 关键字。
总结一下,你可以使用final 关键字来创建三个实体:
final变量final方法final类
final和static关键字之间的区别
总而言之,static 修饰符用于创建可以访问的实体,而不必先实例化持有的class 。
使用static 修饰符,你可以:
- 直接从
static变量访问class - 直接从
static方法中访问。class - 创建具有
static成员的static嵌套类 - 创建
static块,一旦持有的class被加载就会被执行。
另一方面,final 修改器被用来创建固定的实体:
- 你不能改变
final变量的值 - 你不能重写
final方法 - 你不能扩展
final类
同时使用静态和最终修饰符
最后,你也可以同时使用static 和final 修饰符来创建固定的变量或方法,可以直接从持有的class 。
这里有一个例子:
class Human {
static final String tribe = "Hominini";
static final String genus = "Homo";
}
tribe 和genus 都可以被直接访问,但它们的值不能被改变:
class Main {
public static void main(String[] args) {
System.out.println(Human.tribe);
System.out.println(Human.genus);
Human.tribe = "Gorillini"; // ERROR
Human.genus = "Gorilla"; // ERROR
}
}
现在你已经知道了Java中static 和final 修改器的区别,干得好!👍