理解 static final 关键字

java中经常会看到 static final 修饰,有时候static只是瞬间想到静态修饰 这个词。但是没有一个直观的理解,所以这一篇 就来梳理理解一下 static final 关键字。

static

static 被称为静态 意味着 它只有一份。当我们定义一个java类。里面一般有非静态属性和静态属性。

当你创建了多个相同的class 的时候 里面的非静态属性属性就各有各的值。

但是 这时候要切记 不管你创建了多个对象。 静态属性 只创建一份。 它属于类本身
而不属于你创建的对象

换一种说法就是 你用这个类创建了10个对象。 这10个对象共享那个静态属性。

在Java中,被static修饰的静态对象存储在方法区(Method Area)或称为静态区

这就意味着 你要是想修改它 那你就要非常非常谨慎了! 因为它一旦被修改了,那么你创建的10个对象 可能全部会受影响,这种风险是非常高的。

所以通常情况下。我们都不希望静态变量被修改,我希望它永远是第一次被初始化赋值的那个值。

那么怎么样让他不能被修改呢?

哈哈 这时候 就很自然的想到了 还有一个关键字叫 final!

我们就可以 这样 比如(java编程规范中static final 修饰的变量全部使用大写)
public static final String AAA= ”123123“;

是不是很自然的理解了 static final 联合修饰的意思?

static 对象的初始化

上面说了 static 变量的理解。

再补充一点 静态对象的初始化,这里记住两点:

  • 无论创建多少个对象 静态对象只初始化一次!
  • 静态对象的初始化顺序 优先于 非静态对象

我们看个例子:
在宠物类中 有一个猫类 和一个静态的狗类 都显式的打印了构造函数
看宠物类里面的构造顺序 是 cat pet dog 静态对象 我们故意写在最后面

public class Cat {
    Cat(){
        System.out.println(" cat 初始化");
    }
}
-----

public class Dog {
    Dog(){
        System.out.println("dog 初始化");
    }
}
------
public class Pet {
    public Cat cat = new Cat();
    Pet(){

        System.out.println("pet 初始化");
    }
    public static Dog dog = new Dog();
}


现在我们new 2 个pet类 看看初始化的效果:

dog 初始化
 cat 初始化
pet 初始化
--------
 cat 初始化
pet 初始化

发现了没有:
静态对象 dog 第一个被初始化,虽然它写的时候 写在最后。
而且2次初始化 dog只被初始化了一次

这就是静态的理解

静态字段什么时候被初始化

静态字段在首次被访问时进行初始化:当程序首次访问某个类的静态字段时,如果该字段尚未被初始化,则会触发其初始化过程。这包括对静态字段的直接访问,或通过静态方法调用间接访问静态字段。

在类加载过程中的初始化阶段进行初始化:当类被加载到Java虚拟机时,会进行类的初始化过程,其中包括对静态字段的初始化。在类初始化阶段,虚拟机会按照静态字段的定义顺序,依次对静态字段进行初始化。

很多知识点都是触类旁通的,这两种情况更好就对应 单例模式里面的懒汉和饿汉式 大家有兴趣的可以去搜索单例模式看一下

你可能感兴趣的:(Java笔记,java,jvm,spring)