00:01
好了,那咱们就继续再往下了,呃,还是这个static关键字,咱们接着往下看啊,各位,这个东西其实还是很有嚼头的啊,很有嚼头的。嗯,这样。Public class static test07问方法我们写上。嗯。这个闷方法当中啊,我先不写代码啊啊,我先在这写个程序。嗯,比如说static。呃,我这个位置呢,写一个什么呢?Static int I等于100。然后我在这能不能访问这个I呢。
01:00
这里可以访问I吗?首先是这样,大家思考一下,我们之前是不是讲过这是个static,叫静态变量是吧,静态变量在什么时候初始初始化?静态变量在什么时候初始化?静态变量存在哪儿?存储在哪里呀?哎,在什么时候初始化呀,类加载时初始化啊,静态变量存在哪呀?叫方法区是不是好,那静态代码块什么时候执行啊。静态代码块什么时候执行?加载时执行。所以说大家看这个变量这种东西,静态变量它是在类加载时初始化,而静态代码块是在类加载时执行,那你说我这个地方说明一个静态变量。
02:01
呃,我这里能访问吗,各位。你看类加载这是什么。类加载,这个是类加载式初始化是不是,这个是不是类加载式执行啊。那在这能访问I吗,各位?可以吗?可以吧,因为这个静态的东西是不是在同一时间点完成的呀。都是加载呀。是不是?嗯。我看一下啊。这是程序的入口啊,但是在这个入口代码执行之前,其实已经执行很多程序,对不对。啊,其实你要意识到啊,闷方法执行之前啊,实际上。执行了很多代码啊。静态代码块是在哪里的,代码放在方法区啊?
03:05
只要是代码啊,一定是存储在方法区的啊。只要是代码,一定是存储在方法区的。代码片段吗?这不是。对不对,哎。那这个是在类加载时执行,这个呢也在类加载时初始化,那这个I能不能访问呢?这是可以的。咱们说这句话叫men begin啊,来。Java c的编译,Static test06.java Java去运行static test06走。哎呀,0607。变了,是零七了,嗯。啊,零七走。
04:01
I等于100MEN begin是不是只要静态的都是放在方法区中?我再强调一下啊,方法区域当中是放两样东西。一样是静态变量,一样是代码片段。明白吗?你说的静态代码块是说的这个代码片段对吧。方法也是啊,方法的代码片段是在方法区啊。但你方法执行过程当中呢。你方法执行过程当中会压站,会在站里边分配啊。这个这块好像大家还是不是很懂啊。战是什么呢?方法只要执行。
05:02
啊,方法只要执行。会压站。啊,方法存什么,局部占中存局部变量。堆是拗出来的,对象都在堆中。垃圾回收器。主要针对。是吧,这个是叫做实例变量对吧,方法区说的是什么呀。类的信息字节码、信息代码片段。以及什么呀,静态变量。静态变量啊。方法的代码片段放在哪方法区,但是方法执行过程当中的。
06:03
过程当中需要的内存在哪儿啊,在占中。啊在占中,那么静态的变量在静态代码中可以访问。对不对,那现在呢,我再问大家一个问题啊,我在这儿啊,定义一个什么呀,叫做实例变量因特类型K。啊,等于111,你说我在static静态代码跨当中可以去访问这个K吗?K变量可以访问吗?不能是不是,哎,因为这个K变量的初始化是在什么时候初始化呀,是在new对象的时候,是不是这个变量才会内内存空间才会开出来呀。
07:04
K变量是实例变量,在构造方法执行时,内存空间才会开辟,而你这个静态代码块的执行时间是在类加载,它们不在同一时间,所以在类加载的时候,这个K还不存在呢,明白吗?Static静态代码块在类加载时执行。啊,并且只执行一次类加载时,K变量空间还没有开辟出来呢。就K变量,这是对象变量吗?是不是你得先把对象扭出来,这个K是不是才存在呀?你在静态代码块能访问K吗?啊,这是肯定不行的,编译就报错了。第27行是不是第27行啊,我们看一看第27行是谁,是这个这就不行啊。
08:08
是不是?哎,这就不行啊,无法从静态的上下文,它称大框开始到大块结束,叫做静态的上下文,无法从静态上下文中引用非静态变量K。对吧?哎,非静态变量K啊,那么接下来我们再来看一个这样行不行。就是说我在这有个static。这样吧,在这里边写吧,system.out打印输出,输出name等于加一个name,结果这个name在下边定义static string name等于什么呀?张三,诶,这样行不行?各位。这静态代码块在上,静态变量是在下,静态变量在在静态代码块下面。这里。
09:01
可以访问name吗?访问。刚才在前一个例子的时候,我给大家说的是。嗯。静态代码块,它是不是遵循什么自上而下的顺序,先执行这个,再执行这个,再执行这个吧。是不是,哎,那你说我现在我说先执行这个完了之后再初始化这个变量行吗。静态变量初始化和累加,和这个静态代码块执行时机啊,其实是一样的。这个叫静态代码块和我们这个。静态变量,它实际上都是在类加载的时候。那到底谁先谁后,其实最主要靠的还是他们代码的一个先后顺序。
10:01
谁在前,谁先执行。那如果说你sta在前先去访问内完事之后再去声明这个变量,这个行不行啊。我们来编译一下就知道了。非法。前项引用。31行。这块。它是错误的。非法前项引用。因为他这个。静态代码块和静态变量它的执行时机是一样的,对吧。那么,到底谁先谁后,是不是就只能靠代码的先后顺序了?谁在上,是不是谁就先执行?所以他在执行的时候,是不是他还没有啊。所以他说你非法。前向引用,这不行。还要注意,注意什么呢?就是这是静态代码框。
11:01
和静态变量啊,都在类加载的,类加载的时候执行。时间相同。只能靠代码的顺序来决定。谁先谁后明白吧,哎,只能靠代码的顺序来决定谁先谁后,所以这个在执行的时候,那你这个变这还没有执行的,但如果说你要是把这个放到我TE和代码块的上边,对吧?哎,那我这块呢,就没问题了,你看再来你看就没问题了是不是。嗯,就可以了,那如果说你这块没有对吧?哎,那你这块有那不行,那不行。不能颠倒过来啊。你看33行有问题,是不是这行有问题啊,哎,注释掉。那我觉得有必要这样,同学们总结一下。
12:05
总结一下啊,我们总结是什么呢?就到目前为止,大家觉得哪在Java程序里边哪几个地方是有执行顺序的。就总结一下到目前为止你遇到的所有。Java程序。有顺序要求的是哪些?第一。什么呀?对于一个方法来说,方法体中的代码是。有顺序的。遵循什么呀,自上而下的顺序执行。对吧,哎,方法体第二呢。静态代码块和静态代码块。
13:03
静态代码块一和静态代码块二是有什么呀?哎,先后顺序的。第三,静态代码块。和静态变量是有什么先后顺序的?对吧,你想想是不是这个道理,你在main方法里边写的这一行代码叫men begin,然后menover,那我问大家是不是一定会先输出men begin完事之后再轮到这个manover啊。对不对啊,哎,是这样的。啊,然后呢,我们第二点是什么呢?是静态代码块一和静态代码二,就两个静态代码块,这个静态代码块和这个静态代码块它是有相关顺序的。然后还有一个是什么呢?静态代码块和静态变量,就你静态代码块和我的静态变量是有顺序要求的啊,有顺序要求的。那如果说你在类题里边定义了一个方法,说public static void MX方法定义好,然后public static void y方法定义好两个方法,我问大家这个方法放到前边和这个方法放到后边有没有区别,这俩方法有没有先后顺序啊?
14:17
没有吧?在一个类体当中。我们定义的这个叫做方法,是没有先后顺序的。对吧,你Y方法在前或者是X方法在前,都无所谓啊,都无所谓。所以说你还得留点神啊,记一下对不对啊,你说哪个代码它是有顺序的,哪个代码它是没有什么顺序要求的,我觉得这个还是不要去死记硬背啊,死记硬背可能效果还不是很好啊,不是很好。
我来说两句