00:00
好,我们来继续往下学习,那下面呢,要给大家讲解的是一个新的制定叫包对象,包对象,那么包对象呢,它也属于包的内容,那什么叫包对象呢?听这个名字啊,首先它是跟包相关的,同时呢,它可以看作是一个对象。那就有问题了,那为什么我们这个SKY设计者要增加一个叫包对象的一个技术呢?原因很简单,原因很简单,是这样子的,我们前面啊同学们可以看到,在我们这个包里边,注意听,在我们这个包里边,我们可以写类,我们可以写这个treat,这个treat就你先暂时理解成就是呃,接口。啊,我们也可以写object,大家可以看到我确实也写了这些东西,但是有一个缺点什么呢?它不能够写函数,或者叫方法或者变量,比如说它不能在这个包里面直接写。
01:00
函数。不,不能直接写变量,这个是Java虚拟机的一个限制局限。就Java虚拟机他在编译的时候呢,他认为他认为什么呀,同学们他认为一个函数和方法或者变量呢,它应该归属于啊一个对象。啊,所以说这样子的,那么为了弥补这个不足呢,SKY提供了一个东西叫包对象来解决这个概解决这个问题,那么我们二话不说,我们直接上案例啊,我们直接上案例,还是以刚才这个代码为我们基础来进行一个扩展。现在我要解决的问题是什么,听清楚啊,我现在就是要解决能够在能够给我们给我们包增加。函数或,或者说是方法。或者是给他加变量,我要解决这个问题。那么怎么做呢?同学们请看,其实非常简单,它加一个package object can,就在这里面写的这个这些这些这个变量或者是方法呢,就可以被他的同胞。
02:05
来使用啊,这个有点不好理解哈,来我现在呢,给大家讲一个,同学们看,我以这个为例,我以这个呃,Scanner这个包为例,大家可以看到这个包,这个在这个包包里面呢,我们可以写类。我们可以写person,可以写class,也可以写object,但是你在这个里面注意听,你在这里面直接写方法就要报错。注意听啊,在包中,在包中直接写方法或者定义变量就不可以就错误的,那么试一下看看,比如说我在这里定义了一个变量叫name等于。Hello或这个name,比如说这个人的名字叫king。直接报错。啊,不让你,你在包里面不能直接写,因为在Java虚拟机里面认为一个变量不能够属于一个包。
03:01
啊,这是第一个,他不能做,那么我们写个方法呢。我们写个方法,当然也是不能让你用的,比如说我写个c hi。包起来已然报错啊,都都已经不提示你了,因此呢,同学们可以看到,这就出现了一个问题,什么问题呢?我们包里面不能写变量,也不能写方法,于是我们就解决的思路是使用什么呢?使用一个叫包对象的技术来解决。啊,他的来解决,它的出现就是为了解决这个问题,那么我把这句话提出来。然后我们来写,那么怎么去写一个包对象呢?好,首先我跟大家写,直接先写这个东西了,同学们看。好,我写一个package object。Object,然后scanner。欧了。这个就是一个包对象,那么这个包对象是属于哪一个包的呢?注意听我几个说明。
04:04
说明第一点,就是刚才老师说的这句话。就是为什么有包对象,我们来说第二个问题,第二个就是这句话表示什么含义,注意听这句话表示,表示创建或者叫声明啊都可以啊,创建一个包对象,这个包对象叫什么名字呢?就叫SC。啊干它是哪一个包的,它是对应的哪一个包的对象呢?注意听它对应的,它是这个包的。是这个包可以使用的包对象G,它是com.at硅谷点SC这个包。对应的包对象。包对象,好,这是老师说的又一个问题,第三点啊,每一个包都可以有一个包对象,注意听啊,每一个包,每一个包都可以有一个包对象,而且只能有一个。
05:11
你不能写两个啊,第四一点,第四一点包对象的名称要跟这个纸包的名称保持一致。啊OK,包对象的名称名字,名字需要和这个纸包。就是这个名字保持一致。纸包。要保持一致。保持一致一样。那那也就是说你不能这样写,说老师我这瞎写一个啊,我写一个AC好,这个你到时间用了这个地方就跟他对应不上了啊,就你这样这个包就跟他没有关系了。就没关系了,好,所以说呢,我们就要保持一致。好,那现在我们就可以在里面写了,那么那么第第五一点我说清楚啊,在包对象中。在包对象中可以写或者叫定义,定义什么呢?变量。
06:05
或者是方法。好,第五第六点,你这个包对象里面的定义第一的变量和方法就可以在对应的纸包里面使用了,在包对象中。在包对象中定义的变量和方法就可以在对应的包中使用。那么我举个例子,大家看刚才我不能写的东西,在这里通通可以写了。好,我写上一个,刚才叫king,没毛病,我再写一个方法c hi也没有问题。C焊也没有问题,也可以用了。好朋友们,诶,这个地方我稍微的整理一下,好,我打印出一句话就是,呃,就是开包对象的啊,我就直接这样写,Package这个包里面的c hi。谁害,然后我格式化一下。
07:00
诶,你看我就没没有报错,那么这个东西在哪里可以用呢?刚才已经讲了,就是在他的这个对应的包中可以用,它对应的包是哪一个包呢?是这个包好,是这个包我们来用一下,能不能用呢?诶我还真想知道一下,那我在哪里用,我随便找个地方啊,比如说我们就找到这面用,大家看这个test的100实际上是在这个包里面,对不对,所以说我就可以用,怎么用。随便来,我用一下。使用。啊,我就直接直接玩儿了啊。我把这个名字给打印出来,看一下能不能用到。大家跟上我的思路稍微慢一点,这。我动作稍微慢一点,我要用的是这个刚才写的这个包对象的。内蒙,那么你在用的时候怎么用呢?直接拿来用,不需要有任何的过渡,拿来用就行了。拿来用就行了,然后呢,我要用里面的方法。使用包对象的方法怎么用呢?好,我这里不是写了个c hi吗?拿来直接用。
08:08
没问题啊c hi,我看看这边是。DEF。哦,这么他是报了一个错是吧。C hi,我看看这边为什么没有没有让我用呢,名字有的。好,我看看这地方有个啪,好我看这不是应该不需要加任何东西啊啊不需要啊,直接拿来就应该可用啊。再看一下是不是名字写错了。C,汗。嗯,看一下这是怎么一回事啊,看一下名字是可以用了,包对象里面的方法不能使用。哦,我来看一下是为什么。啊包对象是看是不是我有同名的呀,我怀疑啊,我怀疑是不是有同名的。
09:05
我怀疑是不是有同名的,导致我这个地方它不识别。嗯。C。Say hi。好,我看一下是为什么啊,我看看是哪个地方写的有问题。哦,这个地方有个pack office can,可能哪个地方有冲突,我看一下,你看我这边直接拿来用是没有问题的。哦,我在这个地方有一个COK,没毛病呢。Co OK这边有一个,看我这里有一个包,对象写了一个内内和一个COK,我在这直接拿来用没有错呀。那我看看是不是因为因为这个地方是一个object,它它还涉及到一个引用的问题,那我把这个先提到这边去啊,同学们不着急。待会我们看一下原因,比如说啊,我在这写这边是一个包对象看清楚了啊,这边是我们的一个啊一个类一个类,那么这里面呢,我写个方法,比如说我在这边写个方法。
10:08
啊,写个方法啊叫DEF,我写一个什么呢?Test user。好,我在这用,呃,你看这个user是属于谁的呢?是属于这个包的啊,属于这个包的我来用一下,看看在这儿可不可以。Prince。好,我直接说这个name。Name等于加上一个name,好,这个是可以用的。是可以用的,然后呢,我在这里面再去调用一下这个C。方法看这面能不能用。为什么不让用,还怪了还。我看一下这是为什么啊。Say hi,没有毛病呢,Class。Test,然后我写了一个COK,那这样子我先把这张代码拿过来,我测一下原因啊,我测一下原因,我测一下原因,把这个拿过来,为了因为这里面这个内建的特别多,有可能是哪地方冲突,冲突了,我这样子在这边新建一个纸包啊,新建新建一一个包啊,新建一个,我在哪里写呢?我现在先把这边清一下。
11:27
No。哦,我新建一个,新建一个文件,比如说叫做。哦,这个地方package。这个地方是,诶这个地方是,刚才我们是在哪里写这个代码。刚才我们是写的哪的那个代码。是是这个地方是吧,好,我干脆新建一个啊,同学们。我新建一个。新建一个走test。Test这个什么呢?呃,名字我想一想啊,叫做package package object,好,这样子名字给它区分开来。
12:10
好写到这,然后呢,我把这段代码,刚才我写好的这段代码拿过来用一下。拿过来用一下。你看这个地方没有报错啊,没有报错,那我待会反过来看是为什么,大家看这里面有一个scan,这个包其实跟我刚才写的是完全一样的,这是一个呃包对象里面有个内有一个COK,然后这地方是这个包里面的一个,呃,这个包里面有个类叫test,里面有一个方法叫test用到这个包的。嗯,包对象里面的名字和CK也是正确的,那我在这里面用可不可以呢?我看一下啊,其实这里面理论上说应该也是可以用的啊,那我看一下print。啊,你看这个名字其实已经用到了。
13:00
啊,这个名字我已经用到了,然后呢,我再用一下OK。也可以用。也可以用,诶那。同学们发现我刚才写的有什么不对吗?我刚才这个代码里面写的有有什么不对吗。这个地方是不是也是一个scanner嘛,就是对应的这个包的一个对象,那么这个为什么这个不能用呢。为什么不能用了?我看看是不是因为我这个关系啊,这个是scan里面的,我找一找。没错,这个是开了包里面的,这个是对应的包对象里面的。啊,应该没有冲突的,应该没有冲突的,但是为什么不让用呢?怪这样子啊。哦。你你看同学们看我们来做一个比较,看有什么区别没有。
14:02
这是。com爱的硅谷,有建了一个包对象,里面有名字,有方法,这个是他的包。这个是他的包没没问题,然后这里面呢,我用了一个test类,呃,Test类里面有一个方法,用了包对象的名字和COK。这边为了再次体现他能够用了,我在这个test object里面用了,呃,也用了这个name和Co OK,呃,其实好像没有什么区别啊。好像没有什么区别啊。那如果说有问题,那就可能是这边的代码哪个地方我们来调一调吧。哪地方是写错了呢?这个地方是包下面的user,这个地方PACKAGE2。里面有个user,有个他也没问题。这边是一个包对象,这样子我们为了让这个不打架,我们先把这个简化一下,如果遇到这个问题,咱们怎么解决呢?好,先把这些不必要的先注销,能理解意思吧,先注销。
15:08
好,注销完了过后,我们这边有一个包对象这边有个SC,好,我们尽量把这些用不上的先把它拿掉,让他不要来影响我们。对不对,好,这个person我暂时不用,因为这边太多,这个person有可能是别的地方导致的问题,好把这个拿掉,这有个UR保存,Test的100保存。好,这个地方我不用的,我先把它注销。好,这就相对来说干净一点了,我们来运行它一下。我们运行一把,看看这个代码能不能跑起来,呦呦呦。啊呦呦呦,我运行一下,看哪个地方是不是可能会报错。好,果然啊,果然在这里有问题。果然啊,同学们可以看到我这个包,他说已经在一个地方定义过了这个啊,Package已经定义了在一个地方,我们看是在哪个位置,在这。
16:06
在这定义了package,他说已经定义了,我们原先在这儿不是写了代码吗?好,我先把这个也先注销。对,我先把这个也先注销,把这边全都先注销一下。好,都注销这个是就是一个package包了,我们再来找到这个位置啊,再来找到这个位置,我们再来看一下,呃,这个UUU能不能被输出。呃,这个地方还有个manager,这是干什么的,也先注销吧。也先注销再来。因为这个文件在这多了过后呢,就容易冲突啊,看他这还报报一个,他说package已经定义了,在这个地方哪里定义了。咱还难道还还有一个吗。
17:05
Package包明包,我们看一下包明在这个地方,Package object canal好有一种可能性啊,有一种可能性就是我在原先这个位置,这个地方不太好调试,在哪里呢?就在这儿,可能是我以前在写代码的时候呢,这留了一点东西,我把这个找到,找到我们是在s scner里,呃,S scner这个。SC里面我们找到是对应的目录啊,对应的目录,他说这个地方早就定义了,怎么还在,这是哪个地方啊,是object。哦。这个地方是package object,这是哪个地方写过的?不是我写的是这个,我刚写的是这个。我刚写的是这个。这个是在哪个目录下面看一下。
18:02
啊。看啊,不好意思,同学们,实在实在不好意思,我在这个地方居然偷偷的写了一个这个错误,特别难调,我在这个。com艾特硅谷ten目录下面,我在做试验的时候偷偷的写了一个sc package,这个东西害得我现在很痛苦,原先在做测试的时候,我在这里写了一个,偷偷写了一个这个玩意儿。看到没有,在里面写了一个package object这个东西搞得我。头晕眼花,干掉他。哎呀,所以说有些时候你你会发现这个,呃,这个编译器呢。会出现一个什么情况,就是说你可能代码没没有错,但但是呢,就是因为你在运行的时候,因为你好多文件都都一样,都一样都一样结果。搞得你这个就出错了,好我们再来运行一下啊同学们,我们再来运行一下看代码。
19:00
哎,你看这个时候他就没有报错了,他就没有报错,结果我们调了半天,就是因为什么呢?这个原因,好我们把这个打开一下啊朋友们,我们把这个打开一下来吧,同学们,我们现在也直接来用用这个包把这个包打开。这个包对象里面有一个内蒙和一个HIVIV,好,我们来用一用,看看能不能用了。好,走一个,呃,Print name。等于加name OK的OK的,然后呢,我们来调用这个C。哎,终于出来了,其实代码一丁点错都没有。结果你把时间浪费到什么地方呢?就是也不是浪费,就是说就说你以前那个东西把你搞,你们将来做开发会遇到很多非常奇怪的问题啊,但是我没有,我我还是你们调出来了,对吧,要一般我就躲过去算了,这别躲了。
20:00
因为你们将来遇到很多问题,我曾经遇到一个问题啊,我跟很多同学讲课,我说我曾经遇到一个什么问题呢,就是那个问题足足搞了两周搞不出来。其实就特别简单,就特别简单,就是少了一个括号,但是死活调不出来,因为代码量太大了哦,代码就就一步步调试调不出来,有些时候你的错误并并不是你代码的错误,是什么呢?是是别的原因,这个是最恐怖的一般,因为一般的人就会犯,诶代码哪错了没有错啊,代码哪就始终就绕绕进去了,你知道吗?结果原因是什么原因是别的地方导致的,好,我们不管怎么样,这个给它调过去了,大家可以放心大胆的去这样使用了啊来,我把这个先打开。打开啊朋友们打开好,这个浪费了我们一点时间,但是也没有关系,也没关系,毕竟我们呃用起来了,来我们跑一下,来我们跑一下,各位朋友跑起来请看代码,现在我们跑起来过后呢,我们发现诶name是king,而且它调用这个c hi呢也是成功的。
21:04
代码就OK了,也就是说我们讲了这么久呢,就是说我们这个。这个包对象里面定义的变量和方法,我们可以在同包里面去使用,不管是在object里面,还是他这个同胞里面,内内都可以使用,都都是OK的,好,大家看到效果了啊,现在一个最大的问题摆在我们面前了,他为什么可以使用?这个是最难回答的,因为对于我们做程序员开发呢,我们一定要清楚他到底是怎么实现这个功能的,你你作为一个程序员,你应该感觉到很奇怪才对,诶,我在这整了一个包对象,我凭什么就可以在我的这个包里面去用它呢?好像隔山打牛一样,诶这边写了个东西,我这边可以用。
22:00
好神奇,好同学们,现在我们就要来研究一下他的这个关系了啊,朋友们,我们来研究一下他的关系,首先呢,打开我的这个幻灯片,我这里。对包对象的底层原理做了一点分析,那么我们可以加深对它的认识。首先我们来看一下第一点,第一点注意听啊,当创建一个包对象后,在该包下会生成两个。类,两个类,这两个类呢,一个是package,一个是package Dollar,那么我们来看看有没有生成,有没有生成,这是一个关键,打开我们的反编译工具,这个我就讲一次啊,我稍微节奏稍微的放快一点点。好好,我把这个反编译工具打开,我们看包对象到底生成了什么。那作为一个程序员,我们一定要去研究这个问题的,那打开我们的这个,呃,我们是在哪里呢?是在第七个找到scanner,我们是这这个地方看到没有,诶我们是在不不不在这啊不在这。
23:11
因为我们生成的那个类呢,呃,生成的已经跑到了scan里面,还记得吧,应该是在这里面呢,我们person呢,开始都在这啊,不要看错了,这两个文件是新生成的。这两个文件是新生子的,这两个文件就对应那个包对象,再说一遍,这两个文件就对应你的那个包对象及这个对象。这个对象它会生成两个文件,我们来开始往后面加下第七。在底层,在这个底层。底层会这个包对象,这个包对象会生成,生成两个文件,两个类,哪两个类呢?诶各位朋友请看一个类呢,一个类就是package dollar.class一个是package.class那它是分别是干什么的呢?来同学们,我们把这个写到这一个是package。
24:09
啊,package.class还有一个和什么呢?和package package dollar.class那么我们打开这两个文件看一看。点开哦,一个是这个文件。你们看一下,里面有个c have方法,还有一个name方法。那么我们再看这里。在这里呢,又生成一个package Dollar里面呢,也有这个name方法c have方法,还有pack这个构造函数,那我们先来看一下,我们来看一下它是怎么掉的,也就是说此时此刻如果我们画一个图来说的话呢,就应该这样画,我就画一次啊,就说这个包对象。这个将来有面试官问你,你就得把它搞定啊,我们这个包对象,它对应了两个文件,两个文件一个是它,我把这个拿过来。
25:09
简单的跟大家聊两句,一个是这个,我们来看它调用是到底什么玩的啊,一个是这个,一个是这个,这个它首先它对应的这个东西。就是我们这个object,它对应的这一个,对应的这一个文件,还有一个文件。还有一个关键是它,我们把这个也也拿过来。好,它也对应了这个文件,那么它怎么实现调用的呢?来看一下。好,同学们看我,我们可以看到在这个包里面有C方法,还有一个对这个名字进行获取的一个方法在这里呢。大家看这里呢,我们看到里面它有一个,呃,这个方法,而且我们发现是。一个读的方法。对吧,你如果去改变,我们看看能不能行。
26:01
如果我在这个地方,我们这读了一下,那么我要去改变它,我们看一下它支不支持no。No,不能支持你去修改。原因如果面试官问你,凭什么包对象的变量,你不能改变原因,我们看是不是因为我在这里设置的是。这个玩意儿。诶,我问大家一个问题讲到这儿了啊,我把这个,哎,如果把它改成,诶不对啊不对,不是这找错了,这应该是这是吧,如果把它改成这个R呢。诶,你看这条是不是就可以改了,那我问大家,你这个地方如果我再重新编译这个scan,是不是意味着在我们这个底层应该还会生成一个对内蒙的设置的方法,能懂了吗?诶这样就清楚了啊,我就不去做实验了,实验的关系啊,实验关系我就不去做实验了,同学们自己去玩一把,然后呢,我们把这个图拿过来,就说明它还对应了这个文件。那也就是说一个object对象,它生成这两个。
27:04
好,这两个生成以后,我们还是没有回答刚才的问题,我们刚才的问题是什么呢?就是它到底怎么调用的好,现在要完成这个对调用的理解,我们必须再看另外一个文件,哪个文件呢?我们要看的是这个文件。就这个地方发生了什么?教你们在看代码啊,以后你们看源代码的时候,你们就可以按老师那个思路去看,你也不用一不一定非要用那个debug,因为有时候你你用那个源码追你也追不出来。因为逻辑关系你就看不出来,那么我们看这里发生什么,那你应该看哪个文件呢?同学们,你应该看的是test的100DOLLAR那个那个文件,好,我们,呃,不就是test的100那个文件,我们点进去看一下。应该是这哦,明白了,大家看这里。你进来以后,你的入口函数在这里,然后呢,它调用的是test的100DOLLAR点进去。
28:01
点到这里面,我们以前讲过这个关系就是一个object呢,会生成两个类,它在这里面调用了,又封装了一次面。好,这个这个在前面讲过,然后我们再看它怎么掉的哦,它又在这里调用packageage Dollar,注意第一个点是Dollar的意思,Pack给Dollar点哦,它原来是掉着它点进去走到这来了。调的是他,那也就是说他调的是这个里面的静态对象里面的name,或者是c hi。那其实到这分析完了过后呢,大家应该有个感觉,其实目前这个文件好像暂时没有用上,就是从它的底层来看啊,从它的底来看,这个文件暂时没有用上,它是怎么走的呢?它是这样走的。它是这样走的,就是当我们这里有一段代码的时候。当我们这里有一段代码的时候。去用的时候,他其实这个内蒙。
29:04
底层它是怎么走呢?他直接他直接就使用了。我们这个文件里面的。这就是说这个地方它实际使用的是这个文件里面的这个name。只是他使用的时候呢,做了一个包装,准确的讲它是这样用的啊,准确的讲它是这样用的是我们这个package,注意听是这个package里面的猫,我故意这样跟粘贴复制一下啊。Module这个静态实例。这个这个里面的这个静态实例啊,静静态静态的一个对象的点里面的。Name,方法好,明白了,这样就彻底明白了,哦,原来他是这么干的啊,他是这么干的,就是这么一个逻辑啊,我把这个也粘到这来,那其他以此类推。那如果说大家再看再去追你看就是哦,他用的是它生成这个包对象里面对应的这个里面的一个静态对象里面的方法完成的。
30:08
好,这个关系就捋清楚了,这个关系就理清楚了,那么再也不觉得是隔山打牛了啊,就是因为实实在在看到了,那么这个c have呢,也是一样,那如果是c have,它底层用的是什么呢?相当于用的是package p Dollar里面的module。Dollar,点我们的这个C。好方法。好理解了啊,理解看我们这个底层也是写的非常清晰的,你看再再走一圈,这进来过后掉它,掉它过后里面有个pack in Dollar,看这其实这个是核心。啊,这实现这个name,那么下面这个C呢,也是这个方法,看这。好,这样子关系就明白了哦,再也不是隔山打牛的感觉了,就是这个关系大家应该捋清楚了,好,我把这个小小的总结一下啊,这里我还写了一段代码,就是用Java来模拟,这个大家看一下就行了,其实呃,就是把刚才说的那段,那段话呢,用Java写了一遍,我就不再去写了,好,同学们,我把这个走一走啊,报对象的核心就说完,我们来整理一下刚才讲的思路。
31:19
那么刚才讲了一个什么玩意儿呢?讲了一个包对象啊,包对象给他剖析了一下包对象,首先我们讲了为什么需要包对象原因,先给大家聊了两句,为什么需要包对象呢?就是因为呃,他为了弥补啊包对象的出现。包对象的出现是因为你这个包可以定义这些,但不能定义方法和变量,于是我们用包对象来解决。啊,这是我们包对象出现的一个原因,就一个技术为什么要出现,就是他为了解决问题,好,这是它出现原因,那么原因讲完了过后呢,我们就给他来了一个应用实例,对不对,我们讲了一个应用实例,这个应用实例呢,就是刚才老师讲的这一点啊应用实例。
32:10
好,我看看这地方是应该是给一个啊对包对象的应用实例来一个标题三,那么这个应用实例在哪里写的呢?就在我们这个地方写的。啊,就在这地方写的那呃,这边我注销的地方,你可以看,你也可以不看了。因为这个这个文件我也没办法写很多文件,所以说只能暂时写在这里面,大家看一下就应该很清晰的,好,我把这个拿过来,拿过来,我把不要的给你们清一下吧,让你们看的更清晰一点。好,我把这个注销的部分全给你们删掉。啊,给你们删掉源代码,那边我不动。好,这个地方是注销的部分,我先给你们删掉,让你们看的更清晰一点。好,我把这个呢,就给大家拿掉了啊,拿掉了啊,然后我们只保留了什么呢?我们只保留了一个包对象,以及这个包里面对它的调用,好然后呢,我分析了一下它的运行机制,我对写完这个案例之后,我们分析了。
33:12
分析了包对象,包对象的一个底层底的一个实现机制,这个机制是它是怎怎怎么个实现法呢?哦,原来呢,呃是这样子的。我这画了一个图啊,就是一个包对象呢,它会对应生成两个,这个其实暂时没有用,从从我们分析源码来看呢,通析这个源码来看,暂时没有使用到。没有使用到,但是呃,没有使用到,可能有两个原因啊,我感觉第一个呢,就是我们这个反编译工具到底是不是这么准确,要画一个问号,因为反编译工具呢,他并不是这个,呃,马丁写的,所以说这个反译工具的人,他在反编译过后呢,有没有有些问题,这个不好说啊,不好说我只能说,所以说我们经常讲反编译工具只能做参考。
34:04
啊,但是从这个反编译工具来看呢,是暂时确实没有用到,但是从这里面可以看出来啊,我估计当时这个设计者想干一件什么事呢?大家看你们有没有发现这个package和package Dollar最大的区别是它这提供是静态方法。哎,其实我感觉他原先可能是像这样设计,因为你静态方法不需要60例嘛,那相当于说我直接就可以调这个方法了,他原先可能想这么设计,后面呢,呃,可能是因为种种原因,从底层看好像没有调用它。那好久没得,最终呢,我们从这个这个代码可以看出来,他在调用在这个包里面调用它的包对象的方法时,其实是直接使用了package Dollar里面的静态的对象,然后调查方法来实现的啊这你这样去回答是没有任何问题的啊,比如说有面试官问你这个是怎么实现的,你完全可以把老师讲的这个流程机制告诉他,他应该很满意啊,这个就说的很清晰了,呃,如果我们不讲的话,我就直接告诉你,诶这样用就行了,但是你总感觉对吧,不是总感觉好像好像。
35:10
好像是担心什么似的,好了,我把这个原理呢给大家说到这里,我们把它给大家保存到这个位置来。好,这是第一张图。就是我们一个包对象会对应生成两个类,这是肯定的。啊,就是一个包对象,它会对应生成两个类。啊好的,我把它往上拎一下,拎一下啊好,这个讲完就没后面就没难点了啊,就是第一个叫如如图所示啊如图所示。琐事什么呢?就是说一个包对象。一个包对象会。会生成,生成什么呢?两个类啊,两个类,一个这个类的名字都是统一的啊,就叫package和package Dollar,那我问大家一个问题啊,我问大家一个问题,那既然他的名字都统一了,马上就能解析解释出为什么一个包最多只有一个包对象,如果你有两个包对象,那那名字那就冲突了,说他一个包最多只能有一个包对象,而且也也从理论上说只需要一个就可以了,这是第一个原因,第二个呢,我们来看到它的一个调用机制,哎,调用机制呢,从这个地方就看得很清晰了。
36:26
那这个地方是我们的调用的一段代码。哎,这个是看我在这里面用到了它,那么它等价于什么呢?等价于这个我在这调用的c hi,它等价于什么呢?等价于这个好这个地方呢,其实从这看出来应该是调的它。好,这样这个调的是谁呢?用的是他的方法,好,同学们,这是我们的第二一个图,我也给同学们罗列到这里,好欧了啊,这是如图所示啊,如图所示说明了什么呢?说明了它这个图就说明了,说明了调用啊,就是包去使用,使用包对象的啊,变量变量或者或者方法的一个底层原111个这个原原理啊原理好了同学们,关于包对象的这一部分,我们先给大家讲解到这里。
我来说两句