00:00
来,那么这个内存图长什么样呢?咱们把这个画板啊打开。就是什么呢?当什么呢?当变量变成静态变量,内存图是怎样的,就是当。变量是静态变量的时候,内存是怎样的?内存是怎样的来这个同样啊也是什么呢?呃,这个叫做嗯,声明变量的时候,或者变量啊,什么时候声明为静态。的啊好,那么这块呢,咱们还是老规矩啊,把我们整个这个叫做什么呀,Java虚拟机诶给它干什么呀,画出来啊画出来来这块。来我们把这个取消掉啊,行,那么首先第一个呢,我们还是有一个东西叫做方法区,还是有一个东西叫做堆,还是有一个东西我们叫做占是不是?哎,这个是必须要画的啊,这一块呢,我们叫做方法区啊,然后呢,这块呢叫做堆,各位啊,这块呢,我们叫做占这块啊stack。
01:19
行。好,那么这块呢,我们给它删了啊,删了删了之后呢,接下来我们继续啊,首先第一步会先进行类加载,它它都会加载进去,对吧?加载啊大家看这次加跟上次不一样的地方在哪啊,它会把谁啊,把这个class加载进去,把谁呀string.class加载进去,把chinese.class哎加载进去啊,那么加载什么呀,在加载谁Chinese class类的时候发现。
02:03
发现Chinese类中有一个态变量啊,此时会给该静态变量初始化,明白什么意思吧?啊,也就是实际上在类加载的时候,这个时候它就会把这个类当中的这个足的特征啊,其实它已经因为所有的对象100个,1万个一起1万个,10万个,1亿个对象,你这1亿个对象的国籍都是固定的值,那你就没必要说你你给每一个对象分配一份对吧?哎,你可以把它声明成静态的,这样话是类级别就不是对象级别,是类级别了,那你类级别的话,那这块,哎,我们是不是直接在这儿有一份就行了,在哪呀?啊就相当于啊在这儿啊有一个什么呀。哎,嗯。这样理解,这样理解啊。有一个string类型的,哪个类的呀,Country啊,叫做country。
03:04
类叫做不是country Chinese类的啊,Chinese类。Country属性。啊。我来拖一下啊,静态属性啊,那么静态属性的值是。String类型的中国。啊,中国。这就是那个静态变量,各位。啊,然后接下来你才轮到什么呀,我们的一个闷方法执行闷方法那类加载完了,你焖方法去执行,执行这个闷方法的时候会压这那么这个是肯定的啊,在我们这块呢,会进行压战操作,那这个呢,就是我们的焖方法呗,对吧,焖方法战争。那么这个慢方法,战争这块呢,首先第一个等号,右边还是先执行,执行完之后呢,创建个对象赋给左边这个变量,那这样的话就相当于把这个对象就构建出来了啊。
04:08
构建这个对象呢?他会给谁呀?给我们这个ID card和name,给它附上值对吧,由于这个前面没有这个static,所以这个变量存储在哪呀。哎,叫做堆内存当中,注意啊,这个存什么静态变量啊,这里边儿存什么实例变量,这里边存什么局部变量,各位全了啊,Java中一共就三大变量,全了,Java中一共就三大变量啊,Java中一共有三个。变量啊,你必须要掌握哪个变量存储在哪,哪个变量存储存储的位置啊,必须掌握哪个变量存储在哪个变量存储在哪块内存上啊,就是哪块内存上啊,这个必须得知道,在静态变量是在方法区,并且这个是最先初始化的,因为类会先加载,然后呢,你方法执行过程当中,在方法里边生命变量都在站里边,那方法执行过程中如果拗了对象,对象都在堆里边,对象里边有什么有实例变量,实例变量是对象级别的,静态变量是类级别啊就是这是类级别,各位啊,那这个呢是什么呀,是对象级别。
05:25
啊,这是局部啊,New方法里面的局部变量也是放在对应内存里边吗?New方法里边局部变量当然是在占当中啊,是在占当中。听清楚了啊,局部变量,只要是局部变量都在占当中,只要是局部变量都在站里边啊。只要是局部方法,不管你是构造方法还是静态方法,还是实力方法,只要是方法体里边的局部变量都在占当中进行分配啊,实例变量只有你new对象的时候,对象里边才有实例变量啊,是这样的啊,然后静态变量是加static加static啊。
06:08
好了,那么接下来啊,这个程序啊,再接着往下呀,其实在这儿呢,就相当于创建个对象啊,我就把这对象建出来,这就是对象,哎,这个对象就叫Chinese对象啊,叫Chinese对象类型对象,这个对象呢,它现在只有几个属性啊,两个属性ID card。ID card。和什么呢,来这个呢,我画一个啊,画一个ID card,然后呢,还有一个叫做name的。啊,叫做name的。来这画上去啊,这是name的。那么这个name呢,叫做什么呀?叫张三是不是,哎,上面这个ID card呢,它是一个值,这个值呢是谁呢?就是这个值。是不是就这个值啊,拿过来我放到哪呢。放到这个位置上。
07:01
哎呀。放到这。拖一下,嗯,然后接下来这个对象的内存地址就付给了Chinese CE啊,所以这块呢,应该是有一个叫Chinese CE是不是,哎,这个C呢,保存了一个内存地址啊,这个内存地址呢,我就随便画一下,比如0X1234。好,接下来这个呢,内存地址就指向了这个对象呗,是吧,就指向了这个对象啊,然后通过这个引用去访问这个对象里边的数据就可以了啊,访问这个数据就可以了,那么接下来呢,在这块实际上是同等道理,他会怎么着啊,把这个对象再创建一个是不是,哎,然后接下来呢,我们这个是不是。这边还是一个叫Chinese CR吧,哎,CR,然后接下来我们这边是不是又有一个引用保存内存地址,这个内存地址假如说是0X1111,然后接下来呢,我们这个是不是也是指向了这个对象啊。对吧,哎,指向这个对象,那只不过就是说我们这个对象啊,它里边这个编号和我们这个上面编号不一样,这个编号是它拿过来是不是,哎,然后呢,我们在这儿呢,来写上写上啊写上之后呢,我们切一下啊,剪切一下来从这选中啊,选中之后呢,给它拖过去。
08:15
放到这儿啊,然后这边呢,我们是谁呀,就是李四呗。是不是,哎,李四的话,我们给它剪切一下啊,切一下之后呢,我们的。给它盖住啊,给它盖住,那内存图就是这样的一个内存图了,各位就是这一块内存只有一个静态的这块啊,是类相关的,是类相关的。啊类相关的就是这块,如果让我画的形象一些的话,它大概是这样,我把这块给它取消掉啊。就相当于在这呢,有一个什么呀,有一个叫Chinese的class字节码文件啊,有一个啊chinese.class字解码,这个字解码呢。他呢,怎么着呢,去关联什么呀,一块内存空间。啊,一块内存空间,这个内存空间呢,其实就是什呀,就是string类型的country啊,就是string类型的什么呀,Country国籍,这国籍呢,这块呢,它其实就是什么呀,就是中国呗。
09:11
啊,中国啊,这个中国静态变量是关联在谁上面的,是关联在我们这个Chinese class上面的。啊,就是说白了,就相当于我们的这个静态变量,这个静态变量是什么呀?哎,是我们Chinese下边的静态变量。啊是类相关的啊是类相关的。好了各位,那如果是这样的话,我们在这里访问是不是这样访问,我们要访问国籍,访问中国人的国籍,怎么访问,应该是使用类名啊,静态变量应该使用类名点的方式访问system.out点打印,我们输入谁呀?我们输入输出这个叫Chinese啊,Chinese点什么呀?点我们叫country是不是,哎,Chinese country啊,那么接下来我们去编译并且运行Java c呢?去编译Java运行好大家看是不是中国就输出了。
10:14
哎,中国就输出了啊,那么接下来呢,我们再往下呢,system.out.print line打印我们输入什么呀?输入C点什么呀?哎,c.ID card是不是,然后呢,c.out点打印我们输入什么呀?C一点什么呀?Name把这个呢,拿过来之后呢,放在这个位置上,然后这个呢,叫做C2的ID card CR的name,我们再来编译一下啊加va c编译加va运行好大家看是不是中国就输出了,然后接下来这个是身份证号,这是名字,这是身份证号这是什么?哎,名字其实就是这样的,那么如果说我们现在这个程序改一下,改成什么呢?system.out.print打印我们输出什么呢?我们输出这个Chinese下的ID card行不行,chinese.id card,我们把这ID card拿过来放到这,这个行不行啊。
11:00
这肯定是不行的,因为ID card是实例变量,必须得先创建对象,对不对,哎,ID card是什么呀,实例变量必须先定对象啊,通过引用,通过引用点访问啊,通过引用点的方式去访问啊,通过。引用点来访问啊,那么这个时候呢,我们来看一看Java c呢,去编译一下就报错了啊,只要编译就报错,你看这次我可以说了,说无法从静态上下文中引用非静态变量。ID card。就你你这个啊,人家叫什么人家把。你。他把这个用类名去访问,叫做静态的一种访问,而在静态访问当中,你使用的这个变量啊,是用非静态变量,或者叫实例变量,那是不允许的。啊,无法从静态三亚文中引用非静态变量ID卡的。Chinese你用类名啊,它编译器检测你是类啊,用类去访问他,他就认为它是静态上下文,从静态上下文中去引用谁啊,引用你一个非静态变量,你前面没有加static,没有加static,那这个时候就表示非静态变量,非静态变量其实就是实例变量,你访问这个就就不行就不行啊,所以你看编译一下就就出问题了,你看是不是,哎,所以这行代码是不能这样写的啊,但是如果你写country这块是没问题的。
12:21
这块是没问题的啊,Chinese country没问题。啊,没问题。好了,那么这个呢,我想问大家一个问题,就是什么时候变量生命实例,什么时候生命为静态的。什么时候生命为静态呢,各位?如果所有对象就是这个类型的,这个类型的所有对象的。某个属性值都是一样的。对吧,如果这个类型的所有对象的某个属性值都是一样的,不建议定义为实例变量,浪费内存空间啊,建议定义为类级别特征。
13:11
啊,定义为静态变量啊,在方法区中只保留什么呀一份节省内存开销。啊。对,这个宇阳总结的非常好啊,每人一份就是每个对象一份,就是实例的。每人都一样,就是静态的。就是对象级别特征,就是对象级特征,对,就是呃,对象A的属性,哎,怎么说也怎么说合适啊,就是说。一个对象一份吧,哎,这样说一个对象一份的。是实例变量。所有对象一份的是静态变量。
14:05
啊,我不知道这么说大家理解不理解啊,就是一个对象一份是实例变量,就是所有对象一份是。静态变量啊,是静态变量。
我来说两句