一、final
关键字final在Java中有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。
(1)final类无法被继承,同时没有子类,因此final类中的方法默认是final的。
(2)非final类中的final方法可以被继承,但不能被子类的方法覆盖。
(3)final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
(4)final不能用于修饰构造方法。
(5)父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。
(6)当函数参数为final类型时,只可以读取使用该参数,但是无法改变该参数的值。
二、static
关键字static表示或者“静态”的意思,Java语言中没有全局变量的概念,类似理解为c语言、c++中“全局”的意思。是用来修饰成员变量和成员方法,或者静态static代码块。
(1)被static修饰的成员变量和成员方法独立于该类的任何对象。即它不依赖类特定的实例,被类的所有实例共享。对于静态变量在内存中只有一个拷贝,JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
(2)用public修饰的static成员变量和成员方法本质是全局变量和全局方法。
(3)static变量前可以有private修饰,private是访问权限限定,static表示不要实例化,两者之间并不矛盾,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用,但是不能在其他类中通过类名来直接引用。
(4)static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:
类名.静态方法名(参数列表...)
类名.静态变量名
静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字。
(5)用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块(执行优先级高)。
三、final和static共同使用
(1)static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!
(2)对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
(3)对于方法,表示不可覆盖,并且可以通过类名直接访问。