00:00
好了,那咱们继续再往下,嗯,再往下的话,咱们就得再写一个了啊,再写一个,咱们接着看这个static啊static test02。那么我们来看一看,什么时候变量声明成实例变量,什么时候变量声明成静态变量。啊,这个是很有意思的一件事情,就是说我们要解决的一个问题啊,就是说什么时候变量声明为实例的,什么时候声明为静态的。对吧,那这个问题咱们得搞清楚啊,哎,Static test什么呀,零二。Public static voidman。就是说我们现在在这里有个变量int I,我到底是要前面加这个static,还是不加这个static?对不对,哎,这个东西呢,我们要搞清楚啊,所以说这个变量我们到底声明成静态的还是实啊,呃,还是实例相关的,还是静态相关的呢?我们的依据是什么呢?好给大家举个例子啊,我们来定义呀,一个什么定义,一个呃类啊,我们叫中国人。
01:19
啊,中国人为一个类。行吧,那我们class呗,叫Chinese。Chinese,行吧。或者叫中国人。是不是,哎,中国人这是一个类啊,中中各我国日恩人啊,中国人啊,或者是Chinese啊Chinese。能看懂吧。Chinese啊,中国人,那么中国人啊,他有什么属性啊,各位有什么属性啊?你比如说什么。
02:02
是不是,哎,还有啥呀,姓名是不是,哎那个生日。对不对,或者叫出生日期,身份证号姓名对吧,然后还有这个性别对不对,好,我们有没有国籍呀。有没有国籍啊,有吧,哎,我们少写俩啊,我少写俩身份证号。嗯,用一个字符串吧,ID card啊ID card这是身份证号,是不是姓名呢?我们用name吧,啊,或者是real name真实姓名啊,Real name或者是name都行啊,那国籍呢。国籍类型。国际city country。Country啊,国家国籍。那么大家看一看啊。
03:01
对于中国人这个类来说。我们每一个人的身份证号不一样,对吧。所以这个是不是应该是一个对象一份。对吧,因为每一个人的身份号不一样啊,每一个人的什么身份证号不同啊,所以身份证号应该是实例变量。对吧,哎,一个对象一份呗。对吧,好,那这个name呢,各位。名字,姓名也是。一个人,一个姓名。对吧,姓名也应该是什么实例变量。对不对,哎前面都不用加,你不要加static啊,哎,你加上static,你说你你访问这个的时候,你通过类名去访去访问它,类名去访问它,那你这个肯定是不对的。
04:11
因为身份证号应该是先把对象传出来,这个对象啊,它才会有身份证号,没有对象没有身份证号是不是好,那么接下来再往下呢,我们看看这个啊,这个名字也不能加代里克,为啥呀。因为加上static之后怎么着啊,就变成什么呀,类相关的对不对啊,就通过类名去访问了,而访问这个名字应该有一个人吧,我们有人真实存在的时候,怎么才能访问吧,是不是?哎,好了,那么接下来我们再往下啊,国籍。这个本身就是中国人。所以这个国籍是不是永远都是固定值就是中国,对吗?它会随着这个人的变化而变化吗?各位告诉我,来互动一下这个国籍中国人,对于中国人这个类来说,国籍都是什么?中国不会随着对象的改变而改变,对吗?
05:15
显然,国籍并不是对象级别的特征。国籍是属于属于整个族的特征,对吧,整个族人的特征是不是,哎,国籍属于什么呀,整个类的特征。整个族的特征。你对象再改变你的国籍还是中国呀,因为你这个类是中国人啊。是不是,哎,那么假设啊,声明成实例变量,假设声明为实例变量。内存图是怎样的?那假设声明为静态变量,前面加一个呆IC,诶,我们内存图又是怎样的呢?
06:19
我们可以考虑在这给构造方法,比如说我们可以给一个什么呀,无参数的构造方法。啊,虽然可能用不着我们再给一个有参数的构造方法,好吧,这个有参数构造方法,我们就这样给吧,比如说我们有一个什么呀,死string类型的是吧?嗯,这个叫做S一死string类型的S2啊,然后接下来死类型什么呀,叫做。S3,那现在呢,ID card怎么着呢,附上S1对吧,Name呢,附一个什么S2,然后呢,Country国籍啊个S3。一个无参的,一个有参的,这是无参的无参数啊,这叫有参数的啊,有参数的构造方法,那么现在我们这构造方法给了两个啊,我用到这个也可能用到这个啊,所以我都都给他提供上了,那么接下来我就创建两个中国人对象,好吧,Chinese。
07:19
C。New一个Chinese,那这块呢,我给他传一个啥呢,ID card的身份证号。身份证号一大堆啊,那传上去啊,随便写的啊,再往下呢,有一个什么呀,叫做哎叫做name name呢,我这块就给他传一个叫什么叫张三。第三个参数,反正传是国籍,国籍这块我就传个中国。行吧,哎,传一个中国,那么接下来呢,我再来一个,比如说Chinese是不是,哎CR接下来这个号呢,我再给它改一改。行吧,然后这个呢,叫李四啊,他的国籍也是什么呀,中国。
08:02
啊,也是中国,那么接下来我这个程序如果是这样写,我的内存图是怎样的,就是这个呢,我把内存图画一版,完事之后呢,我在这儿呢,再加一个static,然后我再给他画一版。行吧,来,我再给他画一把啊,来,咱们先看这个代码所对应的内存图。好了各位啊,注意听了啊,这块呢,是比较经典的一个内容。来,我们static就是变量声明。变量什么时候声明为静态变量?啊,静态变量来,比如说啊这块呢,嗯,咱们先给它画一下各位啊,整体先给它画一个,比如说这是什么呀,加上虚拟机。来这个叫JVM好了,那么这个JVM呢,这块呢,咱们。嗯。画一个什么呀,叫方法区呗。
09:02
是不是,哎,这个方法区啊。放去,然后接下来呢,这块呢,我们还是老规矩啊叫堆呗。是不是,哎,这就是堆啊,对,然后接下来再来一个我们叫站。哎,大家注意听一下啊,这个呢叫做站来把它拖一下啊,这个叫站stack好了,那么接下来呢,我们还是这个站啊,这个口给它删了。好,这个程序首先第一步会先进行什么类加载这个类,这个类这个类对吧?哎,它都会加载进来,所以我们在我们的方法区当中啊,是应该有什么呀,哎,有。这些东西的。这个点什么呀?Class润点什么呀?Class对吧?哎,Chinese点是不是,哎点点点点这个代码是有的啊,我就不再一一写了,那么接下来呢,我们继续往下,就是我们的闷方法执行,那么闷方法执行会给会在什么呀,站当中进行分配吧,所以这个位置啊,会有一个闷方法的战针啊啊假如是这个意思就行了啊,是抽象的啊闷方法啊战针,那么这个闷方法压进来之后呢,我们先执行代码第一行等号,右边先执行会调用构造方法。
10:26
是不是,哎,其实我说一下各位啊,只要是方法。他就会在这个位置上压站的。只要是方法就会在这个方这个这个上面压站的各位啊。只不过我这省了你构造方法这一块,其实也是会在这里压站,刚才咱们同学啊,在这说了一个什么呢?实例方法还是在堆内存里边吗?我说一下啊,方法不管是静态的还是实例的,你只要调用它都会在。站里边压站。这一点大家注意啊,这一点大家注意,我在这写上啊,既然有同学问,我就在这里答一下这个问题。
11:06
注意注意什么呢,就是说。只要是方法啊,不管是静态方法,实例方法,构造方法啊,只要是方法,不管是这个这个这个他们在运行的时候,他们在运行的时候都是。需要压站啊,都是需要压站,只不过构造方法,如果你构造方法执行结束,最终这个方法会谈战,但是你方法执行结束的这个结果会在这里多一个对象,因为你构造方法的目的就是为了创建对象嘛。我不知道大家有没有听明白啊,就构造方法它也会压站,然后呢,方法呢,它从头到尾也是这样去执行的,执行完之后弹出去了,但是这个构造方法执行结束之后啊,在这个堆里边会多一个对象。
12:05
会把对象创建出来,静态方法也是压战,构造方法也是压点,实力方法不带磁代的我们也是同样都会压战。只要是但凡方法执行,它都是压战,这点大家要注意。啊,收到的话打个一来,各位咱们互动一下,收到的话打个一来。来互动一下啊好,那么这块呢,主要是告诉大家呀,这个方法呀,它的执行啊,它都是压站的,只要方法调用,它都是压站方法执行结束之后,你看哪个构造方法执行结束会在这里边堆里边创建一个对象。是不是,哎实例方法,哎也是在这压站的啊,然后呢,静态方法也是在这压站,都是压站的,这个事儿我提一下。那么我们等号右边先执行,等号右边这个掉,这个构造方法我在内存图上我就不画了啊,但是我只画结果,各位什么意思?就是当这个构造方法执行结束之后,内存是怎样变化的?
13:07
你明白什么意思吧,就是这个构造方法执行结束,它会导致什么呢?就是这会压榨这这个构造方法执行结束了,会在堆里边怎么着啊,会多一个对象,这就是那个对象。对吧,这就是Chinese类型的对象啊,叫Chinese。类型的对象,那么这个对象里边有什么呀?哎,它有。ID card。是不是有什么呀。名字。对不对,有什么呀,哎,有年龄啊,不不不是年龄国籍国籍啊,它是应该有一个叫做什么呀,叫做ID card的东西。啊,它的这个值啊,是多少,是这个值啊拿过来在哪啊在这嗯。在这啊。然后他还有一个什么呀,叫做张三的。
14:01
嗯,来。张三的啊,这个是什么呢?这个是name是不是啊张三。然后呢,哎,由于现在你在这个位置上没有加static,所以它是个实例变量,实例变量它存储的位置在哪啊,是在这个位置上。是在堆里边啊,是在堆里边,我这里再强调一下啊,堆里存什么实例变量站里存什么。站里存什么,哎,局部变量啊,然后接下来在这个位置有一个叫做con。国家是中国拖拉啊拖拉,那么这个对象创建出来之后。它会怎么着呢?会付给CE1,而CE呢,是在我们主方法当中啊,在这个位置上我们有一个哎,Chinese CE,那么这个CE呢,实际上就相当于它保存一个内存地址,然后呢,这个内存地址去指向这个对象是吧,0X1234,哎,随便写了啊,就就这么写了,然后接下来呢,它去怎么着啊,哎,指向谁啊,我们的这个对象。
15:17
啊,它是指向我们这个对象的,大家注意看。哎,这个呢,其实就是C1啊,C1这是变量,那么接下来干什么呢?它呢又去执行了我们另外的一个构造方法,又扭了一次,又付给了CR,其实和上面代码一模一样,那么这个时候呢,就相当于我们上面这个对象怎么着啊,又创建了一个新的是不是,哎,我把它拿过来啊,把它复制一下,然后呢,给它贴过来,拖过来啊,这个对象就有了。那么这个对象呢,它是什么呢?哎,身份证号不一样呗。对不对,哎,身份证号是不一样的,那么接下来我们把这个号呢,怎么着啊,给它切了好吧,哎拖过来放到这儿啊,号不一样,然后这个呢,我们叫什么呀,叫做李四。
16:07
是不是,哎,这个是李四,后边这个还是中国,那么接下来我们在这块呢。来一个啊,李四这个还是中国,那么这个对象创建完之后呢,接下来就付给了谁啊,我们叫做Chinese什么呀?哎CR是不是,哎给他拿过来,然呢给它放到这个位置上啊。放到。那么这块这个变量呢,咱们呢,诶它的这个对象又保存了几天这个内存地址,这个内存地址呢,假如说是0X2457啊,就这么地了啊,然后呢,这个内存地址去指向谁呢?指向了我们这个对象。啊,这个对象来画个箭头。那么接下来呢,哎,C2其实就是它了,就它了。那么现在是这样的,一个一个一个一个内存图,各位啊,大家看,尤其是这个位置上,大家思考一下,你这个类是中国人中,既然是中国人,那你的国籍是不是肯定是。
17:05
中国,也就是说你创建100个,1000个,1万个对象,这个country这块的这个变量的值是不是都应该是中国。如果你采用这种方案的话,把它定义成实例变量对象相关的,大家想是不是有点浪费内存空间呀?就这样做也行对吧,但是有一个问题,这个问题就是浪费内存啊。是不是,哎,对于什么呀,对于我拉的大一些啊。对于Chinese这个类来说,表示的含义是中国人,中国人的国籍一定是中国。不会,因为对象,不会因为对象的变化而变化,显然是整个类的特征。
18:05
啊,不再属于某个对象了啊,显然是整个类的特征,如果定义为上图实例变量会浪费内存。啊,它会浪费内存。确实会浪费内存啊,你看。是不是哎会浪费内存啊,咱们把这个呢,哎保存一下啊保存一下。啊,保存一下是这样的,各位,那你这个程序能不能访问呀。来我们看一下c1.ID什么呀,Card。然后呢,我们访问C一点什么呀,Name,然后呢,我们访问C一点什么呀,Country国家。
19:02
你看我现在把这个拿过来是不是,哎,放到这儿把它改成什么呀?C2C2C2好,大家看这个程序倒是没啥问题,能不能编译,能不能运行。Java c去编译这个static test02.java Java运行static test02走,你看没问题,可以访问是没有任何问题的啊,那么接下来呢,我们啊,这个程序啊。我就给他注释了,各位啊,注释了。注释之后呢,我把整个这个程序我再复制一份啊,大家注意看,再复制一份啊,那我这次呢,复制完之后呢,接下来我在这块干什么,给他加一个static。让它变成静态变量。那变成静态变量之后呢,我在这里啊,要给大家说一下静态变量它也有默认值,那这个默认值是在什么时候负的值,我说一下啊。
20:06
不需要new对象各位,这个变量它就有值,并且这个变量的初始化是在类加载时初始化。啊类加载时初始化并且存储在方法区,这是加有staic的啊,注意啊,重点重点五颗星啊,注意加有static加static的变量叫做静态变量。静态变量,静态变量在类加载时初始化。不需要拗对象,静态变量的空间就开出来了,并且静态变量存储在方法区,各位啊,彻底颠覆了你的看法是不是?哎,彻底颠覆了,而且静态变量一般会给一个值啊,比如说写上中国啊,写上中国固定的呗,因为你是中国人呀,那么国籍这块肯定是中国呀,是不是?哎,肯定是中国。
21:09
那如果说是这样的话,我们这个构造方法也就不能这样写了,构造方法只要写上两个参数就够了啊,S1和S2 S1S2附上值,S3呢就不需要你赋值了啊,它类加载的时候会给它赋值,会给这个变量赋上值啊,然后呢,这个程序改成这样,你这一块也不用传了,你这块也不用传了啊,然后接下来你访问的时候,诶,你访问怎么访问呢?对吧?诶我们一会儿看一下这个C1C2,看一下这个国籍怎么访问啊。我们看一看当前这个程序的一个内存图,还是这样吧,把这个删掉吧,先先把下边的删了啊,删了删了之后呢,接下来我们还是根据这个呢,去画一下我们的内存图,各位程序变成这样之后,我们再去画一下内存图啊。
我来说两句