3月31号面试,被面试官问到static 和非static 的问题。
首先,了解static关键字:在java编程思想里,是这么说的:
通常,创建类的时候,就是在描述这个类的外观行为,除非用new创建那个类的对象,否则实际上并没有获取任何对象,new来创建对象时,数据存储空间才被分配,其方法才供外界调用。
但是,有两种情形是上述方法无法解决的。一种情形是,只想为某特定域分配单一存储空间而不去考虑究竟要创建多少对象,甚至是根本不创建任何对象;另外一种情形是,希望通过某个方法而不与包含他的类的任何对象关联在一起。也就是收即使没有创建对象,也能够调用这个方法。
这样通过static就能满足以上的要求。当被声明为static时,就意味着这个域或者方法不会与包含他的类的任何对象关联在一起。因此即使没有创建这个类的对象,也可以调用static方法或者static变量。
另外就是,不论创建多少个类的实例,静态变量和静态方法,只会占用一份内存。
因此,当一个方法会被反复调用的时候,我们可以考虑将他申明为static,这样,不必每次调用的时候,都初始化类实例,分配内存空间。
static变量在java中的初始化顺序?
依然引用java编程思想里面的介绍:(不得不说这本书经典啊,基本很多细节都藏在小段里了,没事拿出来翻翻总没错!)
静态初始化只会在有必要的时候进行。也就是说,如果不需要创建静态对象所在的类,也不需要以类+"."的形式应用静态变量或者方法,那么,静态变量永远都不会被创建的。
一旦静态对象被初始化了,那么他们永远也不会再被初始化,也就是初始化只会执行一次!只会分配一次空间。
初始化的顺序:
首先是静态对象(如果他们尚未因为前面的对象创建过程被初始化),然后是非静态对象。无法阻止初始化的进行,他在构造器被调用之前就已经发生了。
在类的内部,变量定义的顺序决定初始化的顺序,变量定义散布于各个地方,仍然会在任何方法(包括构造方法)调用之前被初始化。
在子类继承父类的时候,初始化的顺序如下:
在实例化子类的时候:
1.首先会执行父类的初始化代码块(先静态),实例变量的初始化
2.执行父类的构造函数
3,子类的初始化代码块
4,子类的构造函数。
如果类还没有被加载:那么子类通过类名加点的形式调用对象的时候,首先会执行父类的静态代码块和静态变量,顺序就是他们出现的顺序,然后在执行子类的静态代码块和静态变量。
如果类以及被加载过了,那么静态的变量和静态的代码块就不会被重复执行,再创建对象的时候只会执行与实例相关的变量初始化和构造函数。
以上为static关键字与初始化的相关知识,至于类的加载过程,会在以后的博客中单独介绍。