00:00
来咱们继续吧,继续啊,还是什么呢?就是我我给大家出一个出一个题目啊,就是我们刚才在这个这个程序当中,我们一直是怎么着啊,就是在我们的这个。Student里边方法调来调去的对不对啊,调来调去的,那如果是外边的呢。两个类之间调用呢。零二啊。就是说我们有有没有什么就是类似于万变不离其宗的这种感觉。对吧,你再怎么折腾它,这个程序有没有一个特定的规律,就是必须得怎么着怎么着怎么着的,我不知道大家有没有。有没有这样心里,心里有没有这样的数。就是说程序再怎么变啊,程序再怎么变化。啊,叫万变不离其宗。有一个固定的规律。这个规律是什么?
01:00
所有的。实例相关的都是先创建对象,通过引用点来访问,对吧,所有的静态相关的。都是。直接采用什么呀类名。点来访问,好,大家思考一下是不是这样的。你好好想想,是不是这样的。啊。这万变不离其宗啊,有个固定的规律啊。你所有实例的东西是不是都是先定对象,然后通过引用点的方式访问?所有静态的东西是不是都得从采用类名点?对吧,好好想想,好好想想,思考一下啊。来,你比如说。我在这有个方法,我折腾折腾你啊,M一来各位啊,在这个方法叫M2。
02:09
在这有个方法叫M3。在这有个方法叫M4。M4,好,代码我也不写了,就这样了,我就这么问你这么调行不行。谁行谁不行,来告诉我。谁行谁不行,告诉我来。就是你只要能万变不离其宗。有一个固定规律,你把这个固定规律掌握了,其实就没有任何问题,你要是不懂这个规律,我觉得就完了。好了,我觉得啊,大家要会分析啊,会分析。呃,五中在不在五中。吴总在吗?
03:01
五中在的话打个一来行,嗯,你你这个这个程序你怎么看,就是你怎么分析。就是问问五中啊问对吧,你怎么分析这个程序。怎么分析啊,这个程序啊,就是你有没有什么什么标准啊,就分析这个分析这个东西这玩意儿。静态的可以,有的可以。好。就是我们呀,要会分析各位不是说你蒙一下啊,就你怎么分析这个程序第一步。啊,第一步是什么。第一步是闷,方法是静态的。对吧,那么调用main方法。
04:01
JVM调的吧,Java虚拟机调用main方法的时候。直接采用的是什么类名点的方式?所以main方法中没有this。所以main方法中没有this。好,各位分析的第一步你服不服?Main方法是静态的,对吗?JVM调用这个main方法的时候,直接采用的是类名去访问的这个方法对不对?那么所以我们的问方法里面是没有this的,对吗?这件事咱们可以确定对不对好了。可以啊,可以。这是第一步。第二步分析一下M1方法和M2方法是实例方法,没问题吧,这个方法是实例方法。
05:06
按照Java语法规则来说,实例方法必须先拗对象,对不对?通过什么呀。推通过什么引用点的方式吧访问。对不对,所以这个时候呢,你在想前面应该有一个什么呀,叫引用点。对不对?哎,这个引用点只能是this,但矛盾了说main方法当中啊,没有this,所以M1你在这儿就访问不了。你访问不了,你说什么都不行啊,老师们方法可以,不是静态的不行。问,方法是别的就完了啊,加马逊你就加马逊就不认了啊,程序就出问题了,所以你你这两步就可以很轻松的分析出来,就各位有没有发现一个问题,就是说总有一些是要背的。就你有发现一些问题吗?你有发现一些问题吗?总有一些是需要背的,总有一些是需要什么记忆的,在这些记忆的基础之上进行分析,你有没有发现,一般情况都是这样的,你不可能说你这个你不记,那个都不记是吧,你最后光在这嘎嘎嘎嘎分析,那我给你分析不明白。
06:23
有些东西啊,它是是需要记的,比如说这就需要记所有实例的方法,没有带static的,那你这样的方法就说白了就得采用对象扭之完,扭完之后就对象去调,你这样的方法就不需要那个对象,你直接采用类名去调,那你说这种东西是谁谁规定是人家散公司那个团队开发Java语言规定的,你问杜老师,杜老师解释不了。对吧?我也只能告诉你啊,实例方法得你有对象去调,带study直接采用类名去调就行了,但这个东西是是需要你先背会,然后万变不离其宗,根据这两条记忆的规则来推算你的程序是否可以正常运行。对吧,你比如说M1M2M3M4,你就分析了M1M2为啥就不行啊,原因你分析呗,M1M2不带static,你不带sta,你有对象啊,那你问方法啊,实际上是通过这个类去调得问方法,这里面没有Z啊,所以这个时候你的M1和M2就就就就废了,这叫在静态的,咱们也学一学啊,在静态的上下文当中。
07:18
无法在静态的上下文中访问非静态方法。对不对,非静态方法,你看应该是这样,我猜的啊,来咱们看看是不是这样的,Java的review。review02.java走。在静态,无法从静态上文中引用非静态方法。对吧,M1。而实例方法和实例变量都需要有实例才才才那个对对对,有道理啊,磁代那个加载的时候就有了啊,加载的时候就有了,有道理啊,M1M2,所以这个时候你得出个结论什么呢?M1就不行了,这个编译报错了对吧,这个就编译报错了啊编译报错那为什么M3就行了呢?因为呀,编译器检测到M3方法这块啊,它有一个static,所以它这块编译器会自动怎么着啊,把这个代码改掉啊,编译器会自动识别M3静态方法。
08:13
静态方法结果是什么呀?是类名明白吧,REVIEW02直接点什么就行了,诶M3是没问题的,M3没问题的啊,然后接下来这个M4这块也一样啊,对吧,一样呢,它会变成点什么呀,M4叫REVIEW02点什么哎M4,所以你这个就可以呀,哎,你看你编译就没问题。对吧,没问题,那有同学就问了老师,那如果说我想访问这个M1M2。那我应该怎么做呀?那我说了呀,你得先创建对象啊,对吧?哎,那比如说我现在在这有一个X方法,那我这个X方法能不能访问M1M2啊,行不行啊各位这是一个什么方法呀?实例方法对吗?对个实例方法吧,好,我问大家实例方法这个东西是不是我们将来得扭对象才能去调这个方法?
09:10
所以这个对这个方法执行过程有没有this this点有没有this点,有没有当前对象,这个方法,这个方法是实例方法,执行这个方法的过程中,当前对象是存在的,对吧,是不是当前对象是存在的呀,所以它检测到L1的时候。他发现M1是实例方法,那此时会在前面加一个引用点,因为万变不离其宗嘛,实例方法都是用引用去调的,那你这里的大块里边有什么呀?因为前面没有加static,所以它会认为这个方法里边是有this的,它会自动加一个this,明白吗?所以你这里就可以没有任何问题。没有任何问题啊,你再去编译。就没事儿啊,对吧,那你在这调一下这个M3,在这调一下M4行不行啊,那也是没问题,因为它检测到M3方法它是静态的,所以它会自动在这个M3前面加什么呀,诶叫类名点,明白吧,它会自动加这个类名点,所以这里的M1M2M3M4就都行了,你看编译就通过了。
10:14
对吧?那为什么说在我们闷方法当中只能说访问M3 M4 M1和M2访问不了,原因是因为M1M2是实例方法,万变不离其宗,实例方法要先创建对象,再通过引用来访问,你访问这个是要通过引用的,它尝试在这个前面加this点,可以加,但是你在main方法这块加this点加不了,原因是什么呢?是因为你this点这个东西啊,它是我们诶不能出现在静态方法里边,是这样的原因,那么接下如果说在这个位置有一个什么呀特性I呢,等于100,那么接下来我们在这个位置有个s static int类型的J呢,等于1000,那我就问大家一个问题,我在这里能不能访问I和J,我在这个里边能不能访问I,能不能访问J,然后我再问大家,我拿这两行代码拿过来放到main方法里边,我能不能去访问这个I和J呀。
11:04
我们都要考虑好这个问题啊,来各位咱们咱们分析一下吧,好吧,分析一下啊,我再问大家,首先这个static里边有没有this。没有this对吧?那么没有this,我们大家访问这个I,来捋捋I是什么变量,前面有没有static,没有static杜老师怎么说的,是不是说没有static,是不是都得先创建对象,通过引用才能访问,所以我问大家这个I前面是不是会自动加一个引用,是不是会自动加一个引用点啊,那么只能是this点对不对,I this点,但是呢,大家发现什么呢?这是个静态方法对不对?里边是不是没有this啊?所以这个地方访问I是不是就不行呢?但是访问J行不行呢?它编译器一看J哟,是个static,行妥了,它访问这个J的话,它会自动在这个J前面加什么呀,内名点的方式对不对?好,那这样的话大家看是不是就可以访问呀?所以其中I呢,就编译从呃,这个编译就怎么着啊,报错了对吧,这个是报错的对不对,哎,这个是可以的是不是,哎没有任何问题对不对,但上面这个呢,如果在实例方法里边访问这个I和这行不行呢?你实例方法因为啊,它这个将来调这个方法的时候,它有一个对象去调的这个方法,那么这个里边是有当前对象的,你访问这个I的时候,实际上是啥是访问的这个这个这个当前对象的。
12:14
I,所以这块呢,它在运行的时候会把这行代码变成什么呢?会变成什么呀?this.i明白吧,这个呢,会变成什么呀?哎,类名点I明白吧,叫review02.i。就哎,它是很智能的,所以你整个程序当中只有这一行编译报错54行,所以你看只有54行是报错的,对吧?哎,你只有对这个程序它的原理吃透了,我觉得你才能才能把这个东西给它搞定啊,吃透它就说你不要说今天呃能不能掉,明天能不能掉在这儿,能不能掉在那,怎么自己混不清了,我觉得万变不离其宗,最重要的一点就是实力相关的都是用对象。如果你是static,静态相关的都有。都用类名,你只要把这个记住就行了,这个死记硬背的基础之上,然后你再进一步往下分析,你再进一步往下分析明白吧,哎,再进一步往下分析,分析这个程序你才能分析明白啊,要不然你是分析不明白的,你好好想想是不是这样的啊,那我问大家如果想去访问这个I,那你这块怎么办?
13:13
你想去访问这个I怎么办?你只能这样去怎么着啊,想访问谁啊M1M2还有谁呀I,你在static方法中只能自己拗明白吗?什么意思,你总你访问这个I以及访问M1M2,你只能去把这个对象NEW1份是吧?你怎么new啊,它R里new一个它是不是?哎,New完之后呢,怎么着怎么怎么怎么访问呀,那你就system.out点打印输出呗,你就可以访问谁呀r.I呗,对吧?哎,你可以怎么着啊,直接R点M1呀,对吧,直接R点什么呀,M2啊,这可以啊,没问题啊,这个拦不住啊,因为你M1M2我说了用引用就行了,这是个引用啊,没问题啊,宇说老师这不是this吗?不一定的,为啥非得是意思啊,对不对,你用变量R不也行吗?R不也是指向这个对象吗?对不对,哎,你用一个这样的对象去调M1去访问I,去访问M2,诶都是可以的,这样是没有任何问题的啊,没有任何问题的。
14:12
好了,总之呢,我想在这里啊,跟大家聊的一件事,什么事呢,就是说,呃,还是那句话,万变不离其宗啊,最主要就是以后遇到实力相关的就找对象。遇到static静态相关的,你就找什么,就找类名。啊,就找列名,反正你要访问的这个东西。啊,你你要访问的这个东西是一定要,要么是有类的,要么是有对象的,你都得有,只不过有些情况下呀,前面这个地方的这个引用点啊,是可以怎么着,哎,省略的,你说烦人不烦人对不对?哎,前面这个类名点啊,它是可以怎么着,哎,省略的,但是如果说省略,你是否知道它前面是个什么东西,你应该知道它前面是个this点,你应该知道它前面是一个类名。啊,就算省了省了你也知道他是怎么回事儿啊,你得知道它是怎么回事,你不能说你现在不懂他是啥意思了。
15:02
啊,那啥意思了?行,慢慢去分析吧,慢慢去分析,有同学说老师我现在在这个地方有一个int类型的K等于1万,那我现在访问这个K应该是什么点啊,学着学着学懵了,好各位,我问大家一个问题,这是个啥变量?是不是在方法里边的这种变量我们称为局部变量,对吗?局部变量是不是局部变量?访问的时候啊,是不需要啊,什么什么什么点的,明白吗?是不需要什么什么点儿的,只有说你在这个方法外定义的这个变量,这个变量,这个变量你必须是引用点,你这个变量呢,必须得是类名点,那如果说你在这个方法里边定的这个变,那就没有这个什什么什么什么点了,你就直接访问就行了。啊。行了,那咱们就总结这么多吧,啊,总结这么多各位啊,自己要会分析行吧,啊,自己要会分析啊。好,那那那那那如果说大家看好了啊,这样吧,我我还是不太放心啊T。
16:05
T里边有一个public static void啊,有一个T方法。那我现在我想调这个T方法怎么做,各位。啊,我在这儿有一个T1吧,假如说我再来一个方法啊,Public static VO t2方法,我这个类里边有个T,有个T2,这个T2没有static,没有这个sta。对,我现在我想在M里边,想在这个X里边,就就就在M1吧。M1里边啊,我想干啥去调一下这个和这个怎么调。括号吗?你能在一边直接T1括号吗?能这样做吗?同学们告诉我行不行?能吗?就在这想美事呢,是不是?你T1省掉之后这个东西啊,它就会有问题。
17:03
有什么问题呢?它会在这前面自动加一个什么。加this点或者什么加类名点对吧,但是可惜的是你这个T怎么着,它在你这个大框里边根本就怎么着啊,不存在。它是在别的类里边的,那像这种情况下,你就不能省了。啊,像这种情况就不能省了,各位啊。你这块就只能怎么着T1什么呀,点T1你只能这样,只能这样去做啊,那你访问另外的这个方法呢,这个实例方法怎么办。访问实例方法怎么做?这是静态方法,访问这个实例方法是不是得你有这个对象?有的说老师那还不简单吗?直接咔T2完事了行不行行不行,各位。行不行,这样做行不行,那100%不行,你要用T2的话,它会在前面加this,但this说的是谁?说的是我们这个类本身你这个类当中没有这个方法,而T2的方法是在我们另外一个类当中,所以你用的对象应该是T对象,所以这都不能随便来的啊,应该t t new t扭完之后你用T干啥呀?
18:19
哎,去调什么呀,T2。用这个T去掉T2。那这个其实就是访问什么呀,访问外访问Y呃,访问其他类的什么静态方法啊,这个是访问什么,访问其他类的实例方法,就得这样做了,就不能省了,那么大家发现没发现,什么时候就可以省,什么时候可以省。什么时候前面这个东西可以省,就什么,就总结一个大的规律,各位什么时候可以省,你有没有总结,不管你这个方法是实例方法,不管你个方法是静态方法,哎,还是实例方法,不管你是什么,什么时候我们前面这个东西可以省略呀,你有没有总结这样的一个东西。
19:01
记住了,只要是在本类当中。我这个方法调你另外一个方法的时候,你这个方法是在本类当中,我们都可以省,This点可以省,我们的类名点也可以省,你只要记住这个规律就行了,但如果说你要是跨类的话,我这个类呢去调到调到你另外一个类的话,那你这个时候你想省也省不了,根本就省不了,你必须得用类名去调,你必得你有对象,然后用引用去调它。你这个时候就不能借this了啊,你说这块来借一下this用一下妥了,那用不了,因为你T2呢,哎,是属于人家另外一个类型的,而你这里的这个this指的是我们当前这个对象,这个对象的类型是它,它里边是没有这个方法的,所以这块呢,你不要搞混了,不要搞混了啊。来大结论,大结论啊,是什么?只要只要调用的方法,就只要这个负责调用的方法A和被调用的方法B在同一个类当中,在同一个类当中,类似点可以省略,类名点可以省略啊,跨类就肯定是不行了,这是个大结论啊大结论。
20:20
行了,那这样的话,咱们算是系统性的给大家总结了一下啊,总结了一下带代立是怎么样的,不带代IC是怎么样的,对吧,你看你怎么掉的,你不要掉掉掉掉掉懵了,调调,但是我还是那句话,各位啊,万变不离其宗,就是所有实例相关的都是创建对象,用引用去调,所有静态相关的东西都是用类名去调的。都是用类名去调。静态情况都是类名啊,实力情况都得有对象,你没有对象你得找对象,找不着对象就错了,找不到你像这个就找不到对象。对吧,在这个静态方法吗?静态方法执行过程当中,调这个M1M2调不了,为啥,因为没对象啊。没有对象啊,你调调M1M2 M1m2是需要对象才能调的呀。
21:03
是不是,哎,你没有对象,你怎么调啊,哎,好好没问题啊,没问题,行了,我们先休息个15分钟啊。
我来说两句