[13] static 和 final
不论是类、属性,还是方法的声明中,都有一个可设置的“修饰符”,它可以实现一些高级特性。
1、static
static被称之为静态的,并不是指不可以修改的意思,而是说它的内存空间是静态的。
1.1 修饰属性
如果某个类的某个属性被static修饰,那么意味着不论创建多少个对象,它们都是共用该属性,不会有各自独立的值。也即是说,凡是被static修饰的属性也好,方法也罢,它是属于类的,不属于某个具体的对象。所以它既可以使用对象调用,也可以直接通过类名调用。
静态属性是类的所有对象共享,就像一个教室(类)可能有20个学生也可能有30个学生(对象),但是老师始终只有一个(静态属性)。
1.2 修饰方法
同理,被static修饰的方法,称之为静态方法,意味着它与实例无关,不论哪个对象调用都执行相同的操作。这也意味着静态方法中不能出现非静态的属性(即属于对象独立的属性)。
说简单一点,静态方法是不通过对象就可以调用,意味着在对象没有创建之前就可以调用,既然对象没创建,对象属性也就不存在,静态方法中还能存在非静态属性吗?显然不能。
2、final
2.1 修饰属性
final修饰属性,那么在定义时就必须直接赋值或者在构造方法中进行赋值,并且后期无法修改。
常见的一些常量就需要用final修饰,如圆周率 static final double pi = 3.1415926;
final因为修饰的值不能改变,这通常是公用常量,所以很多时候也配合static一起使用。静态常量命名字母全大写,单词间下划线隔离。
2.2 修饰方法
final修饰方法,表示该方法必须有实现代码,且子类不能覆盖该方法。
2.3 修饰类
final修饰类,表示该类不能被定义为接口或抽象类,且不可以被继承。如大名鼎鼎的String类就是一个final类。