Java静态与最终修改器关键字--附代码示例

160 阅读4分钟

在Java中,staticfinal 修饰符都是非访问修饰符,可以修改你定义的实体的行为方式。

虽然都是非访问修改器关键字,但staticfinal 关键字的用途不同。

本教程将帮助你学习这两个关键字的区别,从static 关键字开始。

Java静态修改器解释

static 关键字用于定义具有静态性质的类、变量、方法或块。

class 的静态变量和方法可以被访问,而不需要创建该class 的实例。

在下面的例子中,Helper 类有一个静态变量name 和一个静态方法hello()

class Helper {
static String name = "Nathan";
static void hello() {
System.out.println("Hello World!");
}
}

因为namehello() 都是静态的,你可以调用它们而不需要创建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

同时使用静态和最终修饰符

最后,你也可以同时使用staticfinal 修饰符来创建固定的变量或方法,可以直接从持有的class

这里有一个例子:

class Human {
static final String tribe = "Hominini";
static final String genus = "Homo";
}

tribegenus 都可以被直接访问,但它们的值不能被改变:

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中staticfinal 修改器的区别,干得好!👍