00:00
那么再往下呢,咱们看看其实。这块的东西咱们就是说。定义一下几个类是不是啊,定一下几个类啊,来这个先关掉,然后接下来呢,我们这边呢,看看定一个看看这个啊,这个题目有点超纲。啊,这个题目有点超纲。各位啊,我写个test吧。或者写一个啊,最后一个。行吧,哎,最后一个啊,Public class。Public staticman。先把题目拿过来啊,题目拿过来,那这个题目是有点超纲的,各位啊,岳成当时是讲完第十天第14天的东西,呃,咱们做这个题目实际上是不太合适啊,不太合适,呃,有点小超纲,但如果说你要是预习的话,这个题应该是能做出来啊,定义一个丈夫类husband,定一个妻子类wife,那行,听他的话定一个什么呀,丈夫类。
01:15
是不是哎叫做丈夫类,然后呢,定一个妻子类是不是好,那么怎么定义呢?Class就叫husband呗。是不是,然后再来一个妻子的话,那就class。对不对,哎,Wife好了,那么现在呢,丈夫和妻子类有了之后呢,丈夫类的属性包括身份证号,姓名,出生日期,身份证号。那就ID card就行了啊,姓名还有一个是birth生日对吧,他还有另外一半妻子是不是,哎这个是什么呢?这是身份证号,然后这个是姓名,这是生日,这个是哎叫做哎妻子。
02:01
妻子。妻子啊,那么妻子这边写什么呢?你肯定写什么呀,YW是吧,或者小写Y对吧,这样写。啊,那你wife这块同样也是有什么呀,叫做什么呢?叫做身份证号姓名,诶跟这个一样,你把这个拿过来对吧,放到这儿,只不过呢,他妻子这块呢,他不是有妻子是有什么呀?哎有丈夫,然后丈夫呢,他应该叫什么呀,叫husband呗。好。是不是I house band?啊。那么其实我觉得大家啊,对这个程序啊,其实现在最初接触可能感觉这个东西,呃,就是不适应不适应啊。以后慢慢的其实就适应了各位。啊,慢慢就适应了,为什么呢?因为你想想嗯。你是不是应该是。你和你的爱人啊,或者说女朋友对不对啊,或者说你的妻子。
03:04
你是应该有你妻子的地址吧?我这句话没毛病吧,老铁们。就说你作为一个丈夫,你是不是应该知道你妻子在哪住啊?对吧,或者说通过妻子是不是可以找到丈夫,通过丈夫是可以找到妻子,妻子这儿他实际上将来会有一个内存地址,对吗。它默认值这个引用默认值是不是none none是什么意思?表示空吗?空的话就代表没有,就这个丈夫,她还没有没有没有妻子是不是啊,没有妻子。那如果说这块呢,要想有妻子的话,那这块必须有一个内存地址,0X23指五六指向那个对象呗,那同样这个妻子也是一样的,妻子这块如果有丈夫的话,那丈夫这块他应该是有有一个地址的,是不是啊,应该是有个地址,将来你这必须得怎么着复职。你肯定得通过等号的方式给它赋值嘛。是不是,哎,那行接着看啊,他说什么,分别给这两个类提供构造方法,无参构造和有参数构造方法都要提供,那行吧,那就提供呗,那提供一个,比如说这个先给他提供一个什么呀,哎,无参数构造方法。
04:12
那给他提供上呗,他让你干啥干啥,Husband house是不是哎无然后呢,无餐构造给他提供上去之后呢,接下来在这里提供一个什么呀,叫有参数的构造方法,那么有参数构造方法的话,Husband是不是哎husband然后呢,你可以提供一下,比如说这儿呢,有一个S1,有一个S2,是不是有一个S3,然后呢,再往下呢,有个哎。Wife。W,那这个时候你可以ID card怎么着啊?附一个S1呗。对不对,Name呢,附一个S2呗,是不是,哎,Birth呢,就附一个什么S3呗,Y呢,就附一个W呗。你可以通过构造方法调这个方法的时候,给它传上这个参数,这个参数传过来W不就赋给了这个外吗?付给外的话,外就不等号,相当于这赋值了吗?就相当于他有有有妻子了嘛,丈夫他有妻子了是不是?那这块呢,同样也一样,我可以给这个wife呢,提供构造方法,那构造方法我也提供什么呀,叫做无参数的,无参数的构造方法,那无参数构造方法那就提供一个Y对吧,无参的,然后再来一个什么呀?哎,有参数构造方法,那同样一个道理,其实说白了就是public wife,然后接下来再来一个词质类型S1词质类型什么呀,S2词质类型S3是不是,哎,S2S3,那么再往下呢,再加一个什么呀,House band h。
05:42
那么这个时候呢,我们把这个ID呢,就附上一个值S1,是不是name呢,附上一个值S2,然后呢,Birth呢附上1S3,然后接下来再往下呢,就是husband house这个变量就house它对吧?哎,等于什么呀,等于H。等于H,那么我们的无参和有参构造方法就给它。
06:04
定义完了啊,那这块的H传过来之后呢,就H付给一个husband就可以了。那程序接着往下看吧,他说编写测试程序,测试程序已经写了,然后创建丈夫对象,然后再创建妻子对象,丈夫对象关联妻子对象,妻子对象关联丈夫对象啊,要求能够输出这个丈夫对象的妻子的名字。对吧,或者能够说出这个妻子对象的丈夫的名字。对不对,哎,那这个是什么意思呢?就相当于说你在这里呀,可以创建什么呀,哎,创建丈夫类。丈夫对象是不是你可以在创建什么呀,妻子对象,然后让他俩怎么着啊,他俩结婚呗,等于是。是吧,结婚其实就是产生关系呗,对吧,产生关系啊,产生关系,那么丈夫对象这块呢,你可能调的构造方法,你可以调这个呀。是不是,当然你也可以调这个是不是,哎,那你调这个也行,调这个的话那就husband呗,对吧,你看house husband,然后呢啊,比如说这个叫H。
07:09
是吧,哎,你拗一个什么呀,哎,House。对吧,哎,你就一个house,你溜了house之后呢,接下来这个house呀,其实调,假如说你调无酸构造的话,这些都是空。都是空,那你可以调这个呀。你可以调这个构造方法呀,没问题啊,第一个给个身份证号1111111行不行,哎,内容的话你就给,比如给给给个名字叫张三,然后再往下呢,第三个参数是顿顿,第三个参数是波生日。生日的话,假如说这个是嗯一九呃九九对吧,杠幺零杠幺幺。好,那这个呢。哎,第三个参数传进了,第四个参数传一个外进去。装wife,现在没有wife啊,没有外的是浪呗。行不行啊。可以是不是,哎,可以。
08:02
我先这么写各位啊,其实有参数的构造方法,你也可以提供另外一个构造方法,就是说你只提供这三个参数,这个参数不提供其实也可以的啊,没任何问题,那因为现在创建丈夫的时候,这个妻子对象还没有,所以这边是那啊我们可以理解吧,那创建妻子呢。创建妻子的话,那就是wife呗。是不是哎wife,然后接下来呢,我们就是YW呗,New一个啥呀,哎,New一个这个y new wife的时候呢,这个参数同样呢,需要跟上什么呀,String string string和husband那行了,那么接下来呢,这块呢,可能就是说哎身份证号,比如说222222是吧,哎,然后呢,他叫李四啊,然后接下来呢,我们这块呢。比如说写上,比如说一九呃比呃一九,比如说八零啊杠。哎呀,八零不不合适啊,八九杠幺幺杠幺零啊,然后这边呢,你可以写捺啊,但是你也可以写H。
09:02
没问题啊,没问题,你上面不是已经把对象扭出来了吗?这个对象的地址是不是可以给,给了这个H之后,你把H传进去,是不是就相当于把这个H里边保存这个对象的内存地址是不是就传过去了?这样的话,是不是就相当于这个妻子,她是有丈夫的,对吧?啊,当然你也可以选择什么呀,这直接写个none也是可以的。对吧,你写个那就相当于后期再复职呗,也行,对不对啊,你后期再复职也可以,没有任何问题啊,就相当于这会儿的意思,什么意思啊啊,这个丈夫还没有妻子啊,丈夫还没有妻子啊,然后呢。哎呀。你俩有意思啊,嗯,这个妻子啊。还没有什么呀,丈夫啊,还没有丈夫,那么这边让他俩结婚,怎么结婚呢,H。是不是?一个丈夫啊。那么H是丈夫,丈夫是不是的妻子?丈夫的妻子等于W,这个能看懂吗?
10:07
等于W。这个H是谁呀?各位是不是就是这个husband husband丈夫,他的妻子,这是一个什么变量?各位是不是一个实例变量?对吧,h.Y。HY方等于什么呀?WW就是它呀。那然后呢,其实说白了啊,再往下就是什么呢?就是我们的一个WW指的是wife嘛,Wife下面的house band就是w.house等于谁呀?哎,这个H。这样的话他俩就结婚了,就相当于说把W这个变量里面保存的这个内存地址。给了谁呀?我们丈夫的妻子。
11:00
对吧,把H里边这个引用保存的这个内存地址给了谁呀?给了我们,哎,妻子的丈夫,他妻子作为妻子来说,她丈夫的地址是什么。作为丈夫来说,他妻子的地址是什么?就是这样的啊。构造方法里有一个W变量了,无所谓啊,无所谓啊,没关系啊,你构造方法有个W咋了?没关系,因为你这个方法是在你这个类当中,我这里的W是我自己的W是我闷方法当中W无所谓,不冲突啊,这是H。这是一个丈夫对象,这是妻子对象。是不是啊,当然你也可以这样做,你比如说你在这里,你可以不给这样一个构造方法,你还可以,还可以再给一个构导方法,对吧?有参数的构造方法,你有参数的构造方法,你怎么给啊,你可以再给一个拿过来对吧,放到这儿这个外你可以不加,对不对,这个你可以不加。
12:04
啊。你可以写上这这三个参数的。对不对,其实你写上三个参数啊,它就相当于会给这会给这个外赋一个什么呀,那会自动赋一个now,因为你前三个只是给它附上值的,但没有给它赋值,它系统默认赋值呢,那如果说我们调用这个构造方法的话,传第四个参数直接传过来一个now,是不是同样一个道理,效果是完全一样的,你传过来一个nu的话,12344个参数,这个nu直接传过来nu呢,付给了这个外,实际上是这个构造方和这个造法是效果一样的,如果你调这个构造方法就说白了,可能是只需要传三个参数就行了,第四个参数它直接附一个nu,你如果调这个构造方法的话,我可能就是说前三个参数我附上第四个参数,我主动在这干什么呀?传一个进去,它效果完全相同,没有任何区别啊,没有任何区别,所以说这块你愿意定义几个都可以,你愿意调谁都可以啊来有参数的构造方法,那你有参数的话,这个你也可以删掉是不是,然后这个参数你也可以给他抹掉,没问题对吧,如果你抹掉的话,那。
13:08
接下来我们在这个地方的构造方法,可能就是说可以变成另外一种方式,就是说我这个参数我不传了是吧,包括我们这个也是一样,对不对,哎,我们这个呢,也是给他不传了也行,也没有任何问题啊,你不传的话就相当于它有默认值的。啊。那我们为什么在这写一个none啊?大家想一想,你第一次刚拗这个丈夫的时候,在这行代码之前,在这里是不是还没有创建妻子,所以说你的妻子只能是一个那。当然你要执行到这里的话,因为上面这个丈夫对象已经创建完了,实际上你这个位置没必要为呢,你也可以考虑把这个H给他传进去,这样的话,他的妻子在创建的时候马上就有丈夫了,当然我这里呢,采用的方式是什么呢?就是说有多种方式,各位啊,大家别纠结,就是说。我可以采用下边这个,也可以采用上边这个,不管你采用上边这个还是下边这个,他这个丈夫的妻子是空,这个呢,妻子的丈夫也是空,因为你第四个参数是空,空或者要么是没传值,没传值我们这个也是空,我们这个也是空啊,所以这块呢,我们再往下让他俩结婚的话,你得把地址给了他呀。
14:18
比如说,比如说我的妻子,他的地址是什么,你得告诉我,你得负负负到我我身上对吧,我这我作为丈夫,那总不能让我的妻子这等于空吧,是不是,哎,你怎么让它不等于空啊,你可以给它赋值啊。对不对,H吗?就是H是谁,H就是就是这个对象啊,这个对象就是丈夫对象啊,丈夫对象的妻子,Wife这这个点后边东西都不能随便写啊,这个wife指的是这个变量名。对吧,你访问身份证号你怎么访问的,你访问身份证号怎么访问,是不是h.ID card,你访问这个名字是不是h.name你是不是采用HH是不是这个账号对象h.name。对吧,你访问这个外怎么那你就把这个变拿过来,H点外不就完事了吗?对不对,那你H点外,你你你h.name你赋值怎么负啊,你这样负的对不对,你说H点内啊等号H点内后边直接附上一个,附上一个名字就行了,对不对?哎,那我们这个H点外一个道理嘛,H是不是指的是谁这个对象,那么这个对象H的Y等于后边现在是是空,我们不让它等于空,我们让它等于W行不行。
15:20
W这一块大家看是不是一个外对象啊,对吧,那这个这样的话,是不是把这个W这个变量里面保存的这个内存地址是不是就付给这个H点外啊。那同样的道理吧,W是谁?是这个wife是不是,那W他他的husband这个wife,他的husband这个单词叫husband,那如果你这个叫X对吧,那你这块呢,就叫什么呀,就叫w.X但你这块呢,不叫X的话,哎,你这块叫husband,那妥了,上面这个呢,也应该叫什么呀,Husband就是W,是wife wife它的husband等于什么,HH不就是他吗?这样的话他俩就结婚了啊,结婚之后接下来输出什么呀啊输出。
16:02
呃,输出丈夫对象的妻子。名字。那你怎么输出啊,这个我觉得应该比较简单吧。嗯。对吧?哎,谁的妻子,比如说我们规定一下格式啊,谁的妻子是。谁谁谁。是不是那谁的妻子呀?H。他是一个什么丈夫?丈夫的名字吧,对吧,他的妻子是谁谁谁谁呀。你不能直接在这输出w.name啊,你要这样做的话有什么问题各位。嗯。丈夫的妻子是?嗯。能这样做吗,各位?
17:03
这样做你你对吗?我那个作业提交的时候,有同学是这样做的。有这有这样写的。这样写行吗?这个妻子的名字必须得怎么着啊?各位必须得通过丈夫去找吧?说的啊,没有关联了。这样是从七的对象里面找的名字,不是从账目对象那找的,雨阳说的对啊,就说这种方式,如果说你h.name然后呢w.name其实你上面写的这堆程序都没用。你写让他俩结婚有啥用啊?没有用,你单独拿出一个H对象调他的name,单独拿出一个W对象去调它的name。对吧。那这块呢,其实其实他。你是加了你自己的一个思维进去了。你并没有顺其自然通过这个丈夫去找他的妻子,再去找他的名字,所以这个代码这样写就错了。
18:08
啊,这样写错错错误的错误的啊,当然你可以运行,但是你这块你要这么写,你就不符合业务逻辑了。他要求找的是你丈夫对象的妻子的名字。所以你这块的W呢,你你这个W不能随便在W点内,你这样的话就没有关系了。所以这块呢,你应该是怎么做呀,应该是通过H,这不是h.name这是丈夫的名字嘛,那这个丈夫是H,那h husband husband下边有没有妻子,有吧,所以应该是h.wife是不是点完这个wife之后,大家都知道点wife他是一个什么类型,是一个wife,那这个wife妻子里边有没有名字啊。所以是不是应该是H点外点内。也就你这个代码实际应该是这样写才对,对不对。H点的妻子是谁谁谁?
19:03
好,我们来看一下啊,这个程序呢,就是说呃,咱们同学们在写的时候啊,什么样的都有啊,什么样都有啊,我在这里呢,给大家说一下啊,点Java Java运行last走。张三的妻子是李四。张三的妻子是李四。好,各位,我问大家个问题啊,如果把这注释掉,程序会出什么问题?不能证明富婆是你的,有道理啊。不能证明富婆是你的啊,确实是你,这样的话和这样的话证明H和W之间是不是你通过关系找出来的。对不对?哎,如果h.Y等于W w.house等于H这块呢,要是没有给它附上值,就相当于是说你这个变量啊是空,还有你下边这个类的这个属性啊,它也是什么空你明白吧,如果是空的话,那你在这儿呢,h.name没关系,h.wife妥了,你这个h husband.wife之后呢,点wife这个是空啊。
20:13
空引用去点的话。大家都知道就会出现什么空指针异常,是不是,所以这里呢,就会出现空指针异常,他俩没结婚。你通过丈夫名字找,找到丈夫名字,要通过丈夫去找妻子,妻子是空啊,他俩没结婚啊,你没结婚就代表妻子还没这个丈夫还没有妻子呢,那你在这丈夫的妻子,妻子是空,空点name,你是不是会出现空异常啊,所以这个程序Java c编译Java运行,你看出现第27行出现none pointer exception,这是非常重要的一个异常信息啊,在第27行出现空指针异常,好,这个我们大家应该是能够理解的,但如果说我们。当什么呀,当没有结婚啊,来当什么当?
21:05
当没有结婚的时候,出现空值异常。那当然,如果说你不想让他出现空间,你得他结婚啊,怎么叫结婚啊?对吧,你把她丈夫的妻子给她复上职。通过等号给它附上值呗。对吧?你把妻子的丈夫也附上职吗?他作为妻子,她丈夫是有职的,作为丈夫她妻子也是有的,你不能说他俩对吧,在这儿是空,在这是空,那就代表没有结婚吗?是不是你让他俩结婚就是这样的啊,这样的那。那谁的丈夫是?
22:00
这是作为妻子吧?WW是谁?是不是wife?对吧,你分析这个题目的时候啊,你慢点你慢点各位啊,凡是属性都是点。凡是方法都带括号,我这里提提示一下吧,啊,再提示一下啊,别蒙啊别蒙。别蒙。点后面。只是一个单词。没有小括号。表示访问的是。属性。点后面。有一个单词,单词后面有小括号。表示访问的是方法。你做的封装,那是因为你啊学学的东西比较多一些啊,当时在第14这个作业题的时候,好像还没有没有封装吧。
23:10
没有封装还没讲完嘛,只讲了一部分是不是,所以不能按照那种方式去做啊。别蒙啊别蒙,那HW点内W是谁?W呢,是Y。外的名字对吧?这是妻子的名字对吧?名字是李四,李四的丈夫是谁呢?是。从W作为妻子W这个角度出发,Wife下边有husband,就W点什么。House就是她丈夫,丈夫的名字嘛。是不是,哎,你这样去写,所以这个程序呢,你再去编译,再去运行,你看说张三的妻子是李四,李四的丈夫是张三。对不对,这个程序就是这样的啊,程序就是这样,你写成这样就算过关了,各位啊,你的程序就算通过了。当然这个题目的时候要求能够画出程序执行过程内存图,并且要求在程序中演示出空指针异常的效果。
24:09
对吧,这里其实空值异常呢,我们已经演示了。啊,已经演示了,然后呢。哎,我们这个内存图这块我就不画了,各位啊,自己下来之后画一下。画内存图呢,我再强调一下啊,是程序啊,一步一步往下走。一步一步往下走啊。一步一步走,程序等号,右边先执行,执行完之后怎么着啊,付给左边的变量。哎,你看这个内存图是怎么变化的,其实这个从头到尾你要画上内存图的话,是非常有价值的啊。这个啊,一定要画出内存图,很有研究价值啊,很有研究价值,自己花点时间去画一下好吧。
我来说两句