JAVA-初步认识-第七章-this关键字-静态代码块
一. 静态代码块
代码块是独立的代码区间,独立的一个块。既然是独立的块,自然会有区间。java的区间是用什么表示?用的是{}来表示的。
如果不写static,写成if,就是if代码块。
将static写在代码块前面有什么作用么?运行情况如下:
show run出现是正常的,但是为什么hahah会出现呢?
static代码块没名字,只有static修饰符,是修饰代码块的。那怎么用呢?没有名字,没法直接调用。那它什么时候用呢?上面的结果显示,一运行,该代码块就出现了。
这个代码块非常特殊,是静态的,它满足静态的一切特点,同时它多了一个,静态的特点为随着类的加载而加载,它多了一步,随着类的加载而执行。
我们知道主函数中的第一条语句,new StaticCode().show(); 一new对象,需要用到类,这个类只要一进内存,static代码块立马就执行了。
对程序做一些改变,创建两个对象,运行结果如下
程序语句表明,我们用了两次这个描述类,可是static代码块加载了一次。类的加载具有特殊性。
我们举一个实际生活中的例子,一个人具有一个功能:显示某一个东西。房子代表着内存,人站在门外,我们一呼唤这个人,人就进入了房子,显示了他的东西。
我们一开始对于这里语句的理解是这样的:new StaticCode().show()这句是新建对象,新建对象后调用了show方法。在新建对象的时候,要加载描述类(?),在加载类的同时,static代码块也一起执行了。新建结束后,叫人进入房子,显示了他的东西。显示结束后,人出去了。接着第二句和第一句是一样的,相同的过程执行了两遍,人进入房子显示了两次东西,同时static代码块也执行了两次。这是我们一般的理解,但是和DOS的结果相违背。
正确的理解是,方法随着类的加载而加载完以后,类消失的很快。类消失的很快,还涉及生命周期过长么?就不涉及了么,叫了人,人进来,进来后,人就已经在这了,喊这人再显示一下,还用加载吗?不用了,已经在这里了。所以无论有多少对象,类都在内存中呆着,以供使用。因此,类的加载就是一次。老加载,会导致效率低下。
二. static代码块有什么用
类需要进行初始化么?类不就是一个封装成员的作用么,而且成员各自有定义啊。
构造函数是给对象进行初始化的。不要以为什么类都能创建对象,有的类有可能是不需要对象的(每一个新的知识点的出现,都有其背景资料)。如果这个类里面的功能,是静态的(我们的思维是固化的,类中有静态也有非静态,自然可以是所有的都是静态,也可以是所有的都是非静态),那就表明无需创建对象。
看下面的例子,描述类中的语句,没有一个是涉及对象的,自然主函数中不用创建对象,直接用类名来操作即可。类名.show()也得先加载类,那么static代码块也就跟着执行了。
不是所有的类都是通过构造函数初始化的,有些类是不需要创建对象,就能拾掇里面内容的。那这个时候,这个类有我想做的一些初始化动作的话,是不是可以对它来完成。
观看下面的描述类,描述类中自己完成了定义变量,到对变量进行赋值,输出等一系列操作。
还有人想着改成下面这样,直接将静态变量赋值,但是这么做,只能做一次赋值动作,剩下什么都做不了。如果想对num进行多次运算的话,就不可以。正确的思路是这样,先声明变量,接着在static代码块进行一些运算,做完以后,初始化完毕了,再进行一些操作,或者特定操作。
static代码块是给类进行初始化的,是否就是指给成员变量进行初始化?
什么时候会做这样的static代码块,一般这个类里面全部都是静态成员的时候。
更进一步,在主函数中书写了静态代码块。这个类只要一致性,a就输出了,主函数在它后面。为什么?static代码块随着类的加载而执行,主函数只有被调用,才执行,主函数有名字,而static代码块连名字都没有。主函数是调用执行的,在调用之前先得有类。