一,final关键字
在java中final关键字有“这是无法改变的”或者“终态”的含义。
final可以修饰类,方法,变量,,参数,但是不能休息构造方法。
修饰类型 | 意义 |
类 | final类不能被继承,final类的成员方法就没有机会被子类覆盖(都没有子类),默认是final的 |
方法 | 不能被子类重写,高效,编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率 |
变量 | 用final修饰的成员变量表示常量,值一旦给定就无法改变 |
参数 | 当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。 |
二,static关键字
static关键字有“静态“或者”全局”的意思。
可以用来修饰成员变量和成员方法,也可以形成静态static代码块。
它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
2.1:static方法
static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问(最常见的main方法就被修饰为static方法),它不依附于任何对象,也就没有this。在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
2.2 static变量(不能修饰局部变量-java规定的)
static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
2.3 static代码块
static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次,所以它可以优化程序的性能。
2.4 练习,
public class Main { static int value = 69; static { System.out.println("this is test"); } public static void main(String[] args) throws Exception{ new Main().printValue(); } private void printValue(){ int value = 6; System.out.println(this.value); } }
输出:
this is test 69
首先,在类被加载的时候便先去执行static代码块,所以输出this is test,然后main方法new处理一个对象,其中this代表的是当前对象,即main类里面的value=69,所以输出的就是69。
三,static和final一起用
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”:对于变量,表示一旦给值就不可修改,并且通过类名可以访问。对于方法,表示不可覆盖,并且可以通过类名直接访问。其中当它但对于一些容器类型(比如,ArrayList、HashMap)的实例变量,不可以改变容器变量本身,但可以修改容器中存放的对象。