00:00
好了,那咱们继续再往下了,各位啊,再往下了,那刚才呢,咱们说了哪些规则,我觉得大家总结总结啊总结一下,首先第一个呢,哎,就是当一类没有提供任何构造方法,系统会默认提供一个无参构造方法,这个无参构造叫做缺省构造器。第二个呢,当一个类中手动提供了构造方法,那么系统将不再提供。不再默认是吧。不再默认提供啊,无参数构造方法,无参数构造法和有参数构造方法都可以调用啊,没有任何问题,调的时候怎么调用new去调啊,用new运算法去调构造方法支持方法重载吗?完全支持方法面相同参数列表不同啊,构成方法重载。呃,那么接下来呢,咱们继续往下看吧,啊,继续往下看,我们再换一个例子吧,就别在这折腾了,好吧,别再折腾了啊,我换一个例子。现在这个程序是可以编译的啊,也可以运行的。Constructor。LY。是吧,没有任何问题啊。
01:04
我们继续看。下一个啊,写个U吧,UR啊用户。那么用户这块有什么呢?Public class user。然后呢,我们这边写上什么呢?用户有用户的ID啊,还有这个用户名啊,还有这个,比如说密码啊,比如还有这个,比如说性别或者是年龄啊,总之呢,就这么几个东西吧啊有in这些ID啊,用户名的话,那就死类型name呗。啊,User nameme或者name就行了啊,然后密码就算了,不要了啊,年龄这块的话,我们加一个age啊,ID ID name还有age啊,三个属性或者三个实例变量啊,三个属性三个实例变量啊。实例变量或者叫对象变量吧,对象变量好,现在我问大家一个问题啊,问大家问题,ID name和age都有默认值对吧?是不是ID name age都有默认值。
02:13
对吗?这是第一个问题,对不对啊?答案是对,是不是?你看自问自答啊,ID name age都有默认值对吗?对啊,他们都有默认值,ID的默认值是啥呀?ID的默认值是什么呀?是零。对吧?Name默认值是什么呀?是none name的默认值。是none对不对?A的默认值是什么呀?是零对不对?那么现在关键的问题在于什么呢?我我问大家这样一个问题啊,大家思考一下,思考一下,就是这个默认值它是不是也得赋值,就算ID等于零,它是不是这个零,它也得给它附到ID上这个name这一块,它是不是也有默认值,既然有默认值,它是不是也得给它附上值啊。我就想问的是,这个赋值是在什么,什么时候进行的?是在类加载的时候吗?是在这个类装载到Java虚拟机的时候吗?
03:05
就思考一个问题啊,就是说实例变量都有啊,实例变量没有手动赋值的时候,实际上。系统会默认赋值。对吧,那么这个默认赋值操作是在什么时间进行的。是在类加载的时候。给这些实例变量赋值吗?嗯。是在类加载的时候给这些实例变量赋值吗?就这个ID它默认值是零嘛,对不对,它默认值是零,这个零总能总得附上去,这个name它是不是也总总得附上去啊,还有这个A是不是也总得附上去呀,对吧?哎,那赋值是在什么时候附的呢。是在这个类加载的时候就给它附上值了呢,还是说等对象创建的时候才给它赋值?
04:06
你好好思考一下,我给点时间啊,我给点时间。来,我在这儿呢,我再写一个程序啊,你先思考思考啊。User test,这个很重要,各位啊,当回事啊,不是user test叫test 02点加Y。来。我们这边写一写啊,Public class,我们叫做CONSTRUCTOR02构造方法来构造方法。对应的英语单词啊,在这写一下叫。啊。构造方法对应的英语单词是constructor啊,Constructor这个英语单词啊,叫构造,构造器,有的把它翻译成构造器啊,构造器构造方法作用。
05:10
创建对象,并且创建对象的过程中给属性怎么着赋值,或者叫初始化是不是?哎,那么刚才问到哪个问题呢?就是刚才啊,我们在这个地方问了,说思考一个问题,实例变量没有手动赋值对吧?我们系统会给它附默认值,那这个负默认值实际上也是负值对吧?那么负值是在什么时候负的值呢?是在什么时候的呢?哎,我说了各位啊。千万要记住啊,要记住,因为你ID啊。是你对象里边的东西。ID的访问。不能采用这种方式,大家还记得吗?不能采用这种方式,错误的需要先干什么对象?
06:03
啊,只有对象有了才能谈什么ID属性,只有你有了对象才有名字这一说,你有了对象才有年龄这一说,所以这个系统赋默认值啊,给他零附上去的时候,实际上是在什么时候赋的,是在类加载时候,类加载的时候给这些实例变量赋值吗?类加载大家还记得吗?就是我画图的时候,我在这里,我是不是给大家画了个Java虚拟机这个位置,我是不是给大家画了一个东西叫什么叫做方法区,方法区里边是不是类加载,类加载有个什么呀?User什么点class是吧?哎,什么什么点class,什么什么点class,这就是类加载,那当类加载类装载到Java虚拟机的时候,这个类里边的这个属性就有值了吗?这个类当中这个属性这个属性这个属性就有了吗?不对啊,不对不对,各位啊,它不是在类加载的时候。初始化实例变量,这些变量的内存空间在什么时候开的,一定要注意,还记不记得我们的ID和它的存储根本就没有在这个位置上,根本就没有在这个空间上存它这个在哪存,是在这有个堆堆里边,你得先把对象干什么,你得先把对象尿出来,你还记不记得我们在画那个图的时候,我们new一个U的时候,那么这个时候是不是才会考虑我们在这里给他开一个空间,对吧?
07:21
是不是,哎,给他开一个空间。哎,我们只有new的时候啊,才会把空间开出来,大家想空间开出来是不是里边才能弹这个ID啊,弹这个弹这个这一说,所以我们的这个ID啊,还有这个name啊,还有这个叫做。有ID啊,有这个name啊,还有这个叫做age,这些东西它是在什么时候开出来的呀?哎,是在这个时候。才会把这个空间开出来。明白吗?而这个new掉的这个东西是个啥?这是个构造方法,各位我再圈起来啊,这是个构造方法。哎,当我们调用构造方法的时候,才会给变量赋值,才会给它赋默认值啊,负默认值,所以说我们这个问题问的啊,我自问自答一下,是在累加的时候给这些实例变量赋值吗?不是不是啊,实例变量是在构造方法执行的过程中完成初始化的,完成赋值的啊,这个就算系统给它附上默认值零,这个就算系统给它附上值默认值,那就算这个系统给它附上一个值,默认值是零,那么记住了,这个也不是在类加载的时候给它附上值的,是在我们构造方法调用的时候负的值。
08:42
是在构造方法调用的时候负的值。明白吗?那雨彤老师过的话,我没掉啊。你之前new对象是不是这样new的,我第一天在讲的时候是不是这样创建对象的,就直接new,后边加个类名,现在严格意义上这这个其实是个构造方法的方法名。
09:02
调的是后面没有参数,这是无参数构导方法,为什么我们这个构造方法是存在的?我刚才上一个例子我已经讲过了,之所以这个构造方法存在的原因是因为什么呢?我们这个类里边没定义任何构造方法,当你没有定义任何构造方法,系统会提供一个无参构造。系统会提供一个无参过的,你看你如果提供一个有参的,你试试对吧,你说int a对吧,你提供一个有参数构的方法,无参过的就没了,手动定义有参数的构造方法,无参数构造方法将。消失,我们编译一下就报错了。Java c编译user编译test02.java。第11行出问题了,对吧,第11行谁的第11行这个这不不行不行,你得把这个注释掉。啊,你有两个办法,要么你把它注释掉,对吧,如果你要是不把它注释掉,你想你把它注释掉是实际上这个事就能解决来,你看再编译就行了。
10:09
是不是,但如果说你还想写着这个,那我建议怎么着啊,在这把这个无餐构造怎么着,哎给它手动写出来呗,对吧,这个构造方法是不是对应的就是我们这个这个地方的对吧?引又调的这个方法是谁啊?哎,其实就是这个方法,哎调的就不是这个方法,那这样的话再编译你看就没问题了吗?是没问题了啊。啊,这样保险一些。啊,就当一个类中手动提供构造方法,那么系统将不再默认提供无参数构造方法建议啊,建议将无参数构造方法手动的写出来,这样一定不会出问题。啊,或者去里面加个int a行吗?或者去里面加个int a,去哪加个in a啊。
11:04
在这加音哦,你说在这儿加呀,那可以没问题,你加这个可以,你加这个调的方法就不是不是无参构造了,你调的是这个啦。对吧,诶调这个了啊,那到底是调我们这个还是调我们这个还没讲到呢,各位啊,还没讲到呢。还没讲到呢啊。但是我们直接写无参构造方法会不会导致成员变量没有默认值,不会。不会啊,来我们看一下我们自己写的这个无参构造是不是。哎,实际上你眼睛看这个里边是不是什么也没有啊,哎,给大家说一下,实际上这里有一个ID等于什么零,有个什么name等于什么,那还有个什么A是等于什么等于零,明白吧,实际上是有这三行代码,只不过这三行代码你是看不见的。在无参构造方法里面,大家还记不记得在我们这个实例变量上没有赋值的时候,系统会默认给他附默认值对吧?什么时候给它赋默认值?
12:05
什么时候给他付的默认值?实际上是在构造方法执行过程当中给他负的默认值啊,你就算里边啥也不写也没关系,没关系啊,它会还是在这里边你看不见,有三行代码你是看不见的,我们尝试一下,好吧,尝试一下,你看无操过头啊接下来我们访问一下谁呀U点谁呀,ID哎,我们防问谁呀,U点什么呀,Name防止呀,点什么呀,你看是不是零零,呃,零零啊来接下来编译一下,然后编译之后呢,加上句型constructor test,零一走呃,零二走零弄零对吧,你看零弄零还是有的零对吧?哎,那是不是,哎还有什么呀?哎,零对不对,哎,是这样。是这样啊。当然就是说这里啊,这里实际上有三行代码,有三行代码你看不见,它是有的啊,它会给ID附一个零,给一个name负一个nu,它会给这个age负一个零,你明白吗?它在这有这么三行代码,你是看不见的,来我们再来Java c呢,去编译Java去运行,你看。
13:11
在运行,你看是不是零零到零呢。对不对,你你不写这个东西啊,它其实在这也是有什么呀,哎,有这三行代码的,你不写这个它也是有的,来我们再编译再运行。是吧,零到零。你调这个无参构造方法,实际上走的就是这个构造方法。这个构造方法实际上在大括号里面,你表面看不见任何代码,这个代码实际上已经给这个ID附了一个零,给这个给这个age已经进行了默认的初始化啊,就是无参数构造方法体当中,虽然什么代码都没写。啊,但是但是啊,但是实际上是在这个方法体中进方法体里面进行的实例变量默认值初始化。
14:09
你明白吗?但是实际上啊,是在这个方法体里面进行的实例变量的一个默认值初始化啊,你是看不见的,有的老师那我给他搞个怪,我ID9等于111,完事之后呢,Name呢,我给他起个名字叫李四,完之后呢,A的年龄我给他起个叫30,那这样的话,我要是在这个位置上调无参数构造方法,我这输出的结果是啥呢?那是不是就不是零到零了呢。对吧,因为你调无参构造方法,在这个里边是不是给ID name和age这三个变量,是不是给它附上固定的值了,那么这个时候是不是系统默认值是不是就没了。那如果给它附上值的话,那么在这块我们u.ID u.name u点得出值是不是就不是零到零了,那么大家看是不是这样的Java c呢,我们去编一下Java去运行,哎,这个是没有任何问题的,大家看111,李四和30。
15:01
对吧,这个是111啊,对不对,这是理四啊是不是,哎,这是多少啊,30啊对吧?为什么这个值现在不是默认值了呢?因为你在无参的构造方法里边,你给它鼓捣了点代码,你给他写上了,你给ID name给他手动附上之后,你并没有采用系统默认值啊,对吧?哎,这就表示这就示不再采用什么呀,系统默认值啊。默认值是吧,哎,手动赋值的,就这意思啊。如果调的是有参数的构造方的时候,也会自动赋值吧。对对对对,一样的一样的啊,调有参数过的话,也会自动赋值。你只要是说没有给他手动赋值,它就会系统复不认值,就是实例变量,它有个特点啊,实例变量特点实例变量。对于实例变量,对于实例变量来说,各位啊,只要你在构造方法中没有手动给给它赋值啊,统一都会默认赋值,默认赋系统值。
16:13
都会的,你比如说你现在调的构造方是另一个构造方案,你说哎,U的U2等于new一个U,然后new的时候你调这个构造方法,调的不是这个无参构造了,你这里有一个什么呀,有参数的构造方法是int类型对吧?那你int类型这块传个int类型1111111是吧?哎,那你传完传完之后呢,C点点打印输出,你输入这个U2.id,然后呢,你输出这个U2点什么呀?哎,这个name,然后输出U2点什么呀?H你想想这个是不也是零,这个是不也是none啊,这个是不是也是零对吧?零,那零啊来Java c我们去编一下我们Java器运行。来准运行来看你看下边是零到零零啊零到零是为什么?因为你调的这个构造方法二,这个构造方法走的就是它,它这个大块里边是不是什么也没有,什么也没有情况是不是在这里实际上是给ID付了一个零,实际上在这里付给了一个什么呀,那实际上在这里给他付了一个什么呀,零哎,只不过这个代码你是看不见,看不见看不见看不见明白吧,但它是有的,那它是有的明白吧,来Java c呢,我们去编译一下Java区运行一下,你看就是这样的啊这样的。
17:19
啊。
我来说两句