JLS --(Java 中的static)

最近研究了一下JLS 7,对一些概念有了进一步的认识,为了加深一些认识,希望能将一些自己的理解整理成笔记,加深印象。 

Java 中的static 

static是java中的静态修饰符。在java语言中有多个地方要用到static,那么static究竟都有哪些用途?在这里值得研究一番。 
1、静态字段 (static fields) 
什么是静态字段?顾名思义,静态字段就是被声明为static的字段。静态字段又称为类变量。同样的,非静态字段就是没有被声明为static的字段,又称为实例变量(instance variable)。类变量和实例变量的区别在于,类变量只在类加载的时候被创建并初始化,而实例变量则会在每次实例化的时候产生一个新的实例变量。 
类变量(静态字段)的初始化,初始化语句只会在类初始化的时候执行一次,而实例变量(非静态字段)则不同,每次实例化一个类,都会执行一次。对于类变量的初始化子(initializer)而言,在以下情况会出现编译错误: 
1) 如果初始化语句里包含任何实例变量名的引用;(类的初始化必定先于实例的初始化) 
2)如果初始化语句里出现this或者super; 
关键字this只能用在实例方法体内、实例初始化子,或者构造子内。this,指代一个对象引用值,可以是调用实例方法的对象,也可能是正在创建的对象。super关键字,把当前对象视为其当前类的父类的实例。同样的,super只能用在实例方法体内、实例初始化子,或者构造子内。 
3)在运行时,final static 和通过常量表达式初始化的字段会被优先初始化。 

字段在初始化过程中的使用约束:字段在使用前必须被声明,只能用在初始化子中,不能出现在赋值运算符的左边,通过名字使用,字段的使用块是最深层的类或者接口。 
2. 静态字段(static methods) 

如果一个方法声明为static, 则称之为类方法,非静态的方法称为实例方法(Instance method)。 
以下情况会产生编译错误: 
1) 在方法头或体内使用类参; 
2) 使用this或super关键字; 

类方法和实例方法的区别在于: 
类方法的调用不依赖具体的对象;而实例方法必须通过一个具体对象去调用,而且这个对象在运行方法体的过程中变为this和super关键字的引用。 

个人感觉以上对static和非static的理解,主要还是对JVM机制的基本了解上,对JVM 的stack和heap有些了解,学过C语言的应该能想起点什么,粗陋点说就是内存的分配与加载。 

3. 类的静态成员类型 
类的成员类型可以添加static修饰符,用以声明此类为非内部类,就像类的静态方法一样,内部不可以使用类的实例。 
对于接口成员类型,默认为静态的。 
4. 静态构造子 
形式为:static{ ... },在类加载时运行,对类成员进行初始化。

你可能感兴趣的:(java)