00:00
其他说明,有一些说明是不是在这已经写了?其他说明包括哪些内容呢?你看我这起个名字叫做类变量,相对于实例变量来讲的实例,实例实例就相当于是一个对象。那实际变量,那也就是说我们这个变量呀,或者说这个属性啊,是归你具体某一个对象所有的,A对象你有一份,B对象有一份是归具体的对象所有的,那我们这个类变量,或者叫静态变量呢,跟具体的对象就没有关系了,我不归你具体的对象所有,我呢归这个类所有。怎么理解归类所有这个事儿,我们提到一个问题,那么我们叫静态变量,或者叫类变量也行,静态变量呢,叫随着类的加载而加载。
01:00
这个原来我们没有提过这个事儿,以前呢,我们只是说说一个实例变量啊,当我们逆完对象以后,咱们在堆空间当中,诶,就帮你把这个内幕啊一呢就生成了,相当于呢,原来的实例变量呢,可以理解为呢,是随着对象的创建而加载的,而现在这个静态变呢,是随着类的加载而加载的。那么类加载的时候,跟对象创建的时候,你说这俩谁找啊,肯定类的加载早啊,比如说我通过这样的代码,大家看我这是造了个对象了,当这个代码执行完以后,是不是C这个对象才有了,那你要想是造这个对象,我得用构造器,你要用用构造器,你是不是得先把这个类加载到内存中啊,那么内存中有属性啊,有些方法呀等等的,然后我用一下这个构造器,我用构造器才帮你造对象了,所以我们类的加载肯定是早于对象的。类的加载早于对象,那我们这个属性静态的属性又是随着类的加载而加载的,那也I之意呢,那么这个变量是不是要早于对象的创建?
02:09
啊,我们单独的写那个第二点。就是静态变量它的一个加载,加载指的就是我们把它放到内存中了,静态变量加载呢要早于对象的创建。而我们那些实例变量呢,是在你有了对象以后,或者说你在创建对象的过程当中,才帮你把实例变量呢加载的。它呢要出现的早行,既然我们这些静态变量呢,是早于对象的创建就有了,那言外之意呢,我这儿呢造这个。对象之前只要你用这个类的话呢,其实这个nation属性呢,就已经有了,换句话说我在这个位置的时候,大家看我直接呢,就可以通过Chinese这个类去点这个nation。
03:02
你看我此时点呢,就没有问题了,你也可以呢,给他去赋一个值,比如叫中国。你看此时呢,就不报错了,就是因为呢,我们这个属性呢,是随着类的加载而加载,我直接上来就用这个类,那就意味着此时这个属性呢,顺便也就来了,都已经加载到内存里了,所以我们可以直接通过类点属性的方式去调用咱们的叫静态变量。啊,这个静态变量随着类的加载而加载,然后我们呢,叫可以通过啊泪点叫静态变量的方式。进行调用,那么从这个角度来看,我们随着类的加载而加载,而且你通过类呢,还可以去调这个变量,这变量呢跟具体的对象还没啥关系,所以我们自然而然的把这个static修饰的这个变量就称作叫类变量了,因为人家这个变量是归这个类所有的啊,啊归类所有的,那又由于呢,咱们这个类呢,其实加载的时候呢,它就加载一次。
04:09
那是不是就意味着我们这个静态变量在内存当中也会只加载一次啊?这个写一下三由于类呢只会加载一次。啊,则我们的这个静态变量在内存中啊,也只会存在一份。那么什么叫只加载一次呢?就是咱们这个这就涉及到具体的话,就GM这个加载了啊,这个我们在运行的时候呢,咱们用的这个Chinese的这个类呢,它会把这个类呢,整个加载到我们这个方法区,这个加载完以后,它事后呢还会做一段时间的缓存,就只要你再去用的话呢,它还都在。这个会提升我们这个执行的一个速度了,不会说呢,我们比如下边假设没有这个代码的时候,我们用了个对象,诶你需要用构造器了,我加载一下这个Chinese,然后呢,刚用完以后把这个Chinese就销毁了,说我再用的时候,我再去造一个,不是这样子的,当我们加载这个Chinese以后呢,它会把这个类本身呢缓存起来,回头你要再用的话呢,直接还用缓存好的这个Chinese,这个速度可以更快一些,那只要呢,你别把这个账号虚拟关掉它这块,或者说你内存严重不足的时候,他才考虑清哈,否则的话呢,我们这个类呢,就一直在这。
05:26
只要你这个类在这儿,我们随着类的加载的时候呢,我们那个静态的属性呢,也就加载过一次,也就是说在我们这个类的生命周期当中,这个sta的变量呢,就这一份,你爱造对象造对象,反正我这就这一个,然后你们呢,都共用我这一个,就是这样个意思,大家把这个核心的内容把握住啊,那这个呢,就只存在一份,那我们关心的是存在哪。哎,我们说存在这个,哎,这个这个方法区中,准确的说呢,就是方法区的这个静态域种。静态域,静态就是在这个域,域就是那个field field不就是属性嘛,所以叫静态域,其实就是静态的这个结构放在这了。
06:09
行,这块的话呢,大家把这个事儿就清楚了,呃,那这呢,咱们也说了,说这个类呢,可以调这个静态变量,其实这块呢,我们稍微的带着大家去总结一下,或者写成一个四了,就是此时呢,我们关于这个变量的话,尤其是这个属性分成了叫类变量,还有这个叫实例变量。那么调用它的结构呢,可以考虑现在提到一个类的概念了,原来呢,我们都是用对象调的。那我们现在呢,就提一下这个对象也好,泪也好,他们再去掉的时候呢,哪些能掉,哪些不能掉。行,那关于这个类变量,我们用类去调可以吧,可以啊,因为我们类加载的时候,它就加载了它们两个呢,我们这提个概念叫生命周期了,就是你出生的时候呢,它是不是也有了这个叫生命周期是一样的同时加载的,所以是可以的,那我通过对象去掉了变量可以吧,为什么?
07:08
是不是这个,哎,我这个静态变量或者叫类变量,它的加载量比对象早,我呢先出生你后出生的想调已经有的是不是可以啊,对的,那么我们以前呢,都是通过对象调的实例变量,这个呢也是可以的,因为呢是随着咱们对象的创建实例变量了,这时候加载了他俩是同一个出生的时刻,所以也是可以的,那尤其需要注意的是这个位置。是不是不可以啊,我们还没有对象呢。我还没有对象呢,这时候你想通过这个类去调这个实例变量,不行吧,不行,或者再换句话说,人家这个实例变量是归具体某个对象所有的,你想通过类去掉呢,也掉不了,举个例子,你像我们后边这块,咱们想通过这个叫Chinese。哎,我们去调一下,说name说复制为一个叫嗯,打乒乓球的还有一个。
08:10
对,张继科。行,张继科,我现在想赋值,你看也复不了。这就是我们所谓的你使用这个类呢,去调这个属性,这叫实力变量了,调不了。或者再换句话说,大家还是那个意思啊,你想假设要能掉。假设要能调,咱们说这种实例变量是不是归具体的某一个对象所有啊,那这周就来了个问题了,你说我是改的谁呀,是不是又又出现矛盾了是吧,你根本你也不知道你改的是谁。啊,所以这种事呢,就干脆就不能做啊,这个呢叫编译不通过。啊,我们呢,相当于就不能够通过类呢去调这种实例变量。啊,这个就是这样个事情。好,那么关于这个静态的修饰属性这个事儿呢,基本上呢,就是我们这里提到的这样几个点,这样几个点,然后呢,讲完这个方法以后,我们再来提,什么时候呢,咱们适合把属性和方法呢,生命为静态的啊行。
我来说两句