static
-
修饰成员变量,将这个修饰的成员变量变为类的成员变量也称为类静态成员变量,需要通过 类.变量名 来获取,所有该类实例对象共享该类成员变量,只要该静态成员发生一次变化,那么其他对象中的该静态变量也就改变
-
修饰成员方法:修饰之后,该方法就成为类的方法,需要通过 类.方法名字 来获取,注意:在该静态方法中不能使用非静态的方法和成员变量,这也很好理解,static 修饰方法后就成为类的方法,由类来统一管理,如果在类中调用普通的成员变量,那么该变量是属于某个对象的,是在某个对象中设置,而类中自然无法管理到该对象或者方法
-
修饰代码块:常用于一些类的初始化工作,无论新建多少个对象,修饰的代码块只会在 JVM 对类初始化的时候执行一次,并且顺序优先于普通代码块和构造方法,如果存在父类的话,会先对父类的静态代码块进行加载
-
静态导包用法:例如
import static com.dotgua.study.PrintHelper.*;
public class App
{
public static void main( String[] args )
{
print("Hello World!");
}
/**Output
* Hello World!
*///~
}
我们首先将PrintHelper类导入,这里在导入时,我们使用了static关键字,而且在引入类的最后还加上了“.*”,它的作用就是将PrintHelper类中的所有类方法直接导入。不同于非static导入,采用static导入包后,在不与当前类的方法名冲突的情况下,无需使用“类名.方法名”的方法去调用类方法了,直接可以采用"方法名"去调用类方法,就好像是该类自己的方法一样使用即可
final
-
修饰变量
(1)如果 final 修饰的是一个基本数据类型的变量,那么这个变量只能够在第一次声明该成员赋值时,只能够进行一次赋值操作,之后再再赋值就会抛出异常,该基本数据类型的变量就相当于成了一个常量
(2)如果 final 修饰的是一个引用类型,那么会保证在 java 虚拟机栈中的局部变量里储存的该引用地址是不可以改变的,但是具体的实例是可以改变的,相当于你记住了一户人家的门牌号,但是你不一定知道里面的人家还是不是原来的人在住,可能原来住的那一户人家搬走了 -
修饰方法
该方法不可以被子类重写(覆盖),有点类似与在某个类中的 private 方法,这些 private 修饰的方法不能够被其他类方法到,那自然也就不能够被重写了 -
修饰类
该类不能够被继承
final 域的内存语义
对于 final 域,编译器和处理器都需要遵守其写/读的重排序规则
(1)写 final 域重排序的规则:禁止写 final 域重排序到构造函数之外,因为在其他线程调用该对象引用之前,要确保 final 域已经正确被初始化过了
(2)读 final 域重排序的规则:一个线程中,初次读一个包含 final 域的对象引用,和在其之后初次读取 final 域,这两个操作之间不能重排序,因为在读一个对象的 final 域之前,一定会先读包含这个 final 域的对象引用