Java final和static 修饰符

时间:2023-02-26 12:55:24

一、final

final是不变的,最终的意思。可以用来修饰变量,方法,类。

1. 修饰变量

1 private final int a = 2;
2 private final int b; // final 空白,必须在构造函数中指定初始值.
3 // 因为static 的缘故,必须在定义时指定初始值,不能在构造函数中指定初始值.
4 // 因为访问static 变量根本不用调用构造函数啊,笨蛋!
5 private static final int c = 3;

2. 修饰方法

表示该方法不能被子类重写。使用final 方法的原因有二:一是防止任何继承类修改它的实现。二是高效,编译器在调用final方法时会转入内嵌机制,大大提高执行效率。

3. 修饰类

表明这个类是最终类,不可继承。类中的方法默认也是final 的。

二、static

static是全局或静态的意思,但是java 中没有全局变量这个概念。用于修饰成员变量,成员方法,类,代码块。

1. 修饰成员变量

使用static 修饰的成员变量,其生命周期与类的生命周期一致,也就是说,只要类被java 虚拟机加载,就可以通过类名在方法区内访问。static 变量与实例变量的区别就是jvm 只为静态变量分配一次内存,实例变量在内存中有多个拷贝,互不影响。

2. 修饰方法

使用static 修饰的方法只能访问静态变量或静态方法。因为实例变量或方法都必须与特定的实例对象关联,而类在被jvm 加载时,还没有创建类实例,这个时候访问类实例变量和实例方法肯定出错。

3. 修饰类

一般情况下,不可以使用static 修饰类,除非这个类是内部类。使用static 修饰内部类的作用:非静态内部类中定义static 变量时,必须要加上final 修饰,而静态内部类,定义static 变量时可以不加final 修饰。另外,一般我们构造某个内部类对象时,必须先

构造一个外部类对象,然后使用外部类对象构造内部类对象。而静态内部类,可以不用外部类对象,只使用外部类名即可。

构造一个非静态内部类对象

 1 public class Main{
2
3 public void test() {
4 Main main = new Main();
5 // 使用外部类实例main 构造内部类Inner 对象
6 Inner inner = main.new Inner();
7 }
8
9 class Inner {
10 public Inner(){
11 }
12 }
13 }

构造一个静态内部类

public class Main {
public void test() {
Inner inner
= new Main.Inner();
}

static class Inner {
}
}

 

4. 静态代码块

jvm 在加载类时,按照静态代码块的顺序执行静态代码块。

 

注意:static final 修饰的成员变量(包括类实例),可以理解为静态常量,一旦定义就不能更改。但是对于一些容器类型(比如 ArrayList, HashMap)使用static final 修饰后,不可改变容器本身,但可以改变容器中存放的内容。