java初始化块的作用,是指在类进行实例化的时候一定会执行的动作。理论上来说跟构造器的作用会比较相似,但是比构造器更方便。因为一个类可能会有很多构造器,假如在一个类实例化的时候都要做某种操作,那么就要在所有的构造器中都写上这种操作,就会比较麻烦。此时初始化块就发挥了他的作用。

static关键字的作用,static是用来定义类变量的。一旦一个变量被定义为static,那么这个变量是属于类本身的,不是属于对象的,可以直接通过类来调用这个变量。不仅如此,static定义的变量放在静态域中,程序运行期间,静态存储的数据将随时等候调用。

JVM内存总体一共分为了
4个部分(stack segment、heap segment、code segment、data segment)
当我们在程序中,申明一个局部变量的时候,此变量就存放在了 stack segment(栈)当中;
当new 一个对象的时候,此对象放在了heap segment(堆)当中;
而static 的变量或者字符串常量 则存在在 data segment(数据区)中;
那么类中方法的话,是存在在 code segment(代码区)中了。

final关键字
final关键字书面语上的解释是这样的,final关键字可以用来修饰变量,方法,类。
1.修饰变量的时候,这个变量不能再被赋予其他值
2.修饰方法的时候,这个方法不能被重写
3.修饰类的时候,这个类不能被继承。

成员变量
final修饰实例变量如何指定
1.定义final实例变量的时候就指定初始值
2.在非静态初始化块中为final实例变量指定初始值
3.在构造器中为final实例变量指定初始值
经过编译器的处理,这三种用final修饰的实例变量都会抽取到构造器中赋予初始值。

final修饰类变量如何指定
1.定义final类变量是指定初始值
2.在静态初始化块中为final类变量指定初始值
经过编译器的处理,这2中方式都会被抽取到静态初始化块中进行赋值

局部变量
final修饰局部变量一样需要被显式赋值,java本来就要求局部变量必须被显式赋予初始值。

final变量一经赋值,就不会再改变
对于一个使用final修饰的变量而言,如果定义该final变量时就指定初始值,例如final int a=5;那这个变量将不再是一个变量,而是一个宏变量。所有出现该变量的地方,系统直接把它当成对应的值处理,本质上这个值在编译期就确定了下来。

final方法不能被重写
内部类和匿名类中的局部变量必须用final定义,因为局部变量会随着方法的结束而消失。加入在多线程的程序中,方法已经结束了,但是变量还需要使用,那么程序就会出问题。所以这里在内部类或者是匿名类中定义变量一定要用final修饰