善倾的知识体系构建之路

static关键字

2018-09-21  本文已影响0人  善倾

static 关键字用的非常广泛,它可以用来修饰变量,方法,内部类和代码块。static 关键字允许在没有创建对象的情况下,就通过类来使用属性和方法,这好像不符合面向对象的概念,但是管他白猫黑猫呢,用着舒服就行。

static修饰全局变量

静态全局变量在类的字节码文件被加载到类代码区时,JVM 下一步要做的就是在静态数据区给静态全局变量开辟空间。

静态全局变量会和该类进行静态绑定,并且当该类的对象在堆区开辟空间时,也会有一个和静态变量同名的实例变量存在,指向静态数据区的内存空间。也就是说这个实例全局变量的值是该静态数据在静态数据区的地址!

从上面两个点中就可以得出,static 是不可以用来修饰局部变量的。方法中的变量属于局部变量,它是在栈中的本方法栈帧中开辟空间。而静态变量是在静态数据区和类进行绑定的,那这个不对啊,语法上就行不通。

类是通过静态绑定机制来调用静态方法和变量的,而对象则是通过引用机制实现的此功能。

由于静态全局变量是依赖于类而存在,所以它的生存周期很长,一直在内存中存在,所以没事还是不要乱用静态全局变量。同时也会增大程序的耦合性,因为这个类和这个类的所有对象都可以使用和改变这个属性。

static修饰方法

通常要使用类的某个方法都是通过这个对象的引用变量来调用的,这种调用方法的前提是必须创建对象。但在实际编码中,我们只想调用这个类提供的某个方法以完成特定功能。并不需要创建对象,因为创建对象是一个费时又占空间的工作,这时候就可以用 static 关键字来修饰这个方法,让外界能够直接通过类名调用此方法。java.util.Arrays类就提供了很多针对数组操作的静态方法。

因为静态方法是和它所属的类进行静态绑定的,因此在调用此方法时不需要传递 this 指针,也不会接收 this 指针。所以静态方法中无法使用需要 this 指针才能够使用的非静态数据。

static修饰内部类

在java.util.LinkedList类中就使用到了静态内部类

static 修饰代码块

代码块也是一个工作区间,所以在代码块中定义的变量,其作用范围也只限于此代码块中。try catch 中用的多,要留心,细节在用到的时候很重要呢!

普通代码块

在类的代码中,可以使用代码块来给属性进行初始化,这部分代码是在构造函数被调用之前执行的,一般而言将它放在所有属性声明的最后面,养成习惯就好。

总之记住一点,构造函数是对对象的属性进行初始化的,他一定是在内存空间分配完成之后,才调用的。对象在内存中分配空间的时候,会首先给属性分配空间初始化默认的值,如果有显式初始化则赋指定的值。然后执行代码块的内容,对象内存空间全部分配完成后,再调用对象的构造函数。

在类的代码中,可以使用代码块来给属性进行初始化,这部分代码是在构造函数被调用之前执行的,一般而言将它放在所有属性声明的最后面,养成习惯就好。类的普通代码块是每创建一次对象,就会执行一次。静态代码块是只在这个类的字节码文件第一次被加载的时候,调用一次,以后不再被调用。

静态代码块

static 修饰过的代码块称之为静态代码块,它在类代码被加载到内存时就会被立即执行。更确切的说,使用 new 或者通过类调用静态方法时,这个类的字节码文件就会被加载到内存中。

创建一个新对象,其在内存中分配空间的时候执行顺序是这样的。首先给属性分配空间并初始化默认的值,如果有显式初始化则赋指定的值。然后执行静态代码块的内容,接着执行普通代码块的内容,直到对象内存空间全部分配完成后,再调用对象的构造函数。这是因为构造函数是对对象的属性进行初始化的,只有对象的所有准备工作都做完了,才会调用构造函数。

上一篇下一篇

猜你喜欢

热点阅读