00:00
那刚才呢,咱们把这个静态变量这个它的一个使用呢,就说清楚了,对比一下咱们之前没有使用static来修饰的这个变量一个区别,大家注意一下,实际上呢,咱们在一开始第一天写代码的时候呢,就已经用过这个静态的结构了,比如说大家用这个system.out的时候,你会发现呢,我们只用直接呢,是拿这个system呢,这个类直接去点这个out,那此时这个out呢,就相当于是咱们system这个类当中的一个静态结构了,所以呢,我们才可以点,包括呢,咱们这个我就在这写个吧,这算是一个举例了啊,相当于这个静态结构的一个举例。静态属性举例,刚才呢,我们提到一个system,它里边这个out派呢,咱们之前呢,用到这个叫mass mass里边咱们有一个叫,呃,这个rey还不行,派派的话呢,也是我们max当中定义的一个静态的一个变量。
01:04
其实不能叫变量了,它还是个常量,只能说是静态的一个结构属性,这样来说先这呢都是咱们提前都已经用过的,也就是说呢,咱们以前说的说,我们呢要想用类中的属性,以前我这样讲的说,要想用类中的属性,我得呢先创建当前类的对象,通过对象点属性我们去调用,其实这句话呢,到现在呢,得稍微做一个调整啊,对于非静态的这些属性还是跟原来一样,得有对象,通过对象上去调,那么对于这种静态的结构就不用再去造对象了,直接呢可以通过类呢去调。当然了,你通过对象调也行啊,只是说呢,我们直接通过类呢,就可以做到这样的一个情况了。这是这样个意思,那么这个静态的属性呢,我们刚才也提到了,说它呢是存在于方法区中的静态域里的,那么针对于咱们目前讲的这个情况呢,带着大家呢,来画一个这个内存的一个结构,这呢其实我已经画了一个图了,大家可以下来呢看一看,这呢我们再重新画一个针对的代码呢,就是咱们现在提到的这个类。
02:13
然后创建这个类对象的这个过程,CTRLC拿过来,这是声明的这个叫Chinese这个类,接着的话呢,咱们在上面一个main方法当中,我们呢,做这样的这个操作了。这是一个事儿,这是一个事儿,这是一个事儿。那这个然后我们放小一点好,这个呢是咱们这个类的定义,这呢是咱们真正要看的这个方法的一个执行,呃,这个代码的一个执行,我这呢就没有把它包在一个main方法里了,我们主要呢,就是看到这个代码的执行,这里边我们要画这个内存图的话呢,就不止咱们说的栈和堆了,对此时呢,咱们需要引入的一个新的结构呢,就叫做方法区。
03:11
这让我这样画一下。或者好看一点的话了,我就这样包起来得了。这样看的稍微大一点,其实这个代码可不是说在这里了啊。那么我们先提一下这里的三个结构,这是站,再回顾一下我们最初讲的站结构主要存什么?局部变量。然后堆堆放什么。是不是拗出来的结构啊?这个new出来结构呢,主要指的就是对象和数组。
04:05
嗯,多项数组就是我们拗一个person,拗一个int型的数组,这都是属于我们拗出来的这个结构都是在我们这个对空间当中,接下来提一个叫方法区,方法区method的area,这个叫方法区,它呢主要来存放的内容呢,提到这样几个信息,第一个呢,就是类的加载信息。然后呢,还有叫静态域,还有我们说的这个叫常量常量池,这呢都存在咱们这个方法区当中,涉及到哪些内容,咱们到后边再说,比如这个类的加载信息呢,咱们也可以先到后边呢,再讲到这个,嗯,反射的时候,我们再来详细的说一下这个事儿,然后这个常量池的话呢,我们提到这个string的时候,后边咱们讲常类的时候呢,再来说它现在呢,咱们提到一个叫静态域,来看这样一个结构,下边呢,我们来看来看这个代码的执行,这段代码呢,咱们是放在main方法当中,既然你是一个方法了,这里边凡是生命的变量都应该是一个局部变量,所以我们一上来的话呢,呃,先看一下有局部变量你在用啊,一上来的话呢,没有局部变量的声明,首先呢,我上来就拿Chinese donation了。
05:22
那么既然你声明或者叫用这个Chinese了,那我们首先呢,一定得涉及到这个类的一个加载,那么类一加载完以后,我们这个结构呢,在这个方法区里边呢,就会生成相关的一些东西了,那么我们说这个静态的这里边儿这个nation静态的这个属性会随着类的加载而加载,意味着呢,就是我们第一行代码一上来的时候,我们在堆空间当中,这就算是一个叫静态域了。这个静态玉当中,就是针对咱们当前这个类Chinese类来讲的,我这个nation呢就已经加载了。
06:01
这个就已经加载了,加载的话呢,仍然满足咱们一开始的时候那个过程,那nation的话呢,是一个string类型的,首先有一个默认输入化值这个no,然后紧接着咱们在这通过类的方式呢,进行调用了,改成中国。行,那这呢就给大家改了一下,然后再接着呢,我们下一行代码,我呢声明了一个变量,这呢就是一个局部变量了,我们又来一个对象,所以此时我们在占空间当中,先声明这个C。所以对空间当中我们去拗了个对象。这个就放到这儿了。这个用对象我用这个绿的来表示了,用完这个对象以后,我们说这个实例变量就是我们这里边这个name和age是存在我们堆空间当中的。
07:08
Name和A,那这呢,也是先按照你这个默认这个初始化值,对它是个no,它是一个零,那那这个过程我就这个省略了啊,就是其实先有个now,先有个零,然后呢,咱们这个指针的话呢,地址值首地值赋给我们这个CC呢就指过来了,然后接下来呢,我们通过这个name和age呢,对它进行了一个重新赋值,把它呢改成姚明。我把这个默认复制这个就给省略掉了,然后这呢是一个40,就这样的情况,注意呢,就是我们这个内幕的话呢,这个姚明其实没在这儿。咱们暂时到目前呢,先大家先写到这儿,其实详细的话呢,咱们提过一下,它呢,实际上是在这个常量池里的是吧,其实呢是是在这块,然后这块呢,是放了个地址,然后这过来的这个咱们到后边呢,专门在说这个事儿,大家呢,目前先这样考虑,就是你知道呢,我们name和age呢,是每个对象一份这样的情况,这样完了以后呢,再接着我们去声明一个CR。
08:09
C2 C2的话呢,我们又扭了一个。对象。这个对象呢,同样的会有这两个属性,内膜A这个呢,马龙30。那然后呢,把我们这个对象的首地址值付给我们这个C2 C2呢就指过来了。当然是先指过来我们后改的值啊,这个我就顺便刚才给改了,那么到目前为止呢,我们代码呢,就长这个样子了,这个这个这个代码我刚才给忽略掉了是吧,那这个呢,我这样一下,我把它放在这吧。那么到目前为止,上面这个代码呢,我们就执行完了,执行完以后,接下来我们通过这个C呢去调这个nation,首先我们这个nation呢,它也是加载到我们当前这个类里边的,你是个静态结构,所以我们通过这个对象,你对象呢也是个Chinese的,所以我们是可以来调这个nation的。
09:15
通过我这个C呢,是可以调理nation的,那我调nation的时候呢,把它改成叫CHN,那就意味着我们此时的这个中国呢,就被修改掉了,体现呢就是它只有这一份。改成CHN,改完以后,如果我们再通过这个C2呢,去调我们这个类当中声明的这个内的时候,它就是CHN了,那现在我也确实能掉,但我掉的时候呢,我不是说想输出了,而是呢,对你又改了,改成叫China。那就改成这样了,那改成这样以后。
10:00
我们再通过类去调也好,还是说呢,你这几个对象去调也好,那最终的结果呢,就还是它了。就体现了我们首先呢,大家通过这个图呢,了解的就是静态的这个属性呢,放的位置跟原来不一样了,然后它只有一份。然后呢,这个通过对象或者类去调的时候呢,要一个改了,然后另外再去调的时候呢,也是修改以后的原因,就是因为它就一份,诶这呢,就我们所说的叫静态属性,或者叫类变量的一个加载。类变量与我们这个叫实例变量,这个内存的一个解析这样的一个情况,好大家呢,通过这个图呢,来体会一下他们二者的不同,这就可以了。
我来说两句