00:00
来,那么咱们继续。往下看啊,往下看,我们一起来研究一下啊Java啊行原。深了各位啊,深层往深层次上走了啊各位,不知道各位能不能得啊,我在这里呢,我讲的比较深入一些啊,我们来一起研究一下va空格的执行过程啊,以及原理啊,以及原理。来各位,那Java就是你你打开这个DOS命令窗口,你打开这个窗口之后,你在这个位置Java空格hello word敲完回车都发生了什么。就是在这个位置上对吧,你敲完回车都发生了什么。嗯。对,D盘cost加啊,就是敲完回车。啊,都发生了什么?啊,都发生了什么来?
01:02
第一步。会先启动JVM。我们Java虚拟机。啊,第二步。Java虚拟机启动之后加GM会。去启动。累加在一起。啊,Class loader这个单词你不认识无所谓,这个汉字你认识吧。汉字你认识就行啊,你不用管别的啊,就现在我们在这讲这个原理啊,就是我们一起研究一下这个东西的执行过程以及原理啊,就是说我们在这里Java哈沃敲完回车都发生了什么,第一步实际上是他会先去启动这个叫做类这个启动这个叫做Java虚拟机啊,啊其实你也可以看着之前咱们这个这个这个这个这个图。这个图啊。
02:00
这个Java命令呢,只要一敲回车,它这个时候呢,会启动整个Java虚拟机,然后实际上是Java虚拟机,它就调度这个类加载器啊,调度类加载器,这个类加载器,这个加载器叫做。Class类加载器是干啥的呀?类加载器的作用?嗯。来重点听了各位啊,这个类加载器类加载器,那当然它的作用是加载类。加载类这不废话吗?是不是啊,有的人说老师你这这不废话吗?类加载器能我知道类加载器加载类的呗,哎,你说的有道理啊,是加载类的,但是本质上类加载器是干啥的。本质上啊类加载器负责去硬盘上找。找类。对应的。字节码文件。我不知道这么说大家理解不理解啊,这么说大家理解理解。就比如说我们Java空格敲完回车之后,它这个Java虚拟机会启动我们类加载器,类加载器实际上会去硬盘上找这个word.class文件。
03:11
就是类加载器,就假设啊,假设是。Java hello。那么类加载器,类加载器会去。会去硬盘上搜索hello word.class文件。啊,假设是是什么是Java泰斯塔啊,那么。类加载器。会去硬盘上搜索。test.class文件。
04:00
啊,我不知道这么说大家理解不理解啊,就是这个我们在研究的是它这个第一步啊是什么,第二步是什么,就是我们加va hello word敲门回车之后,它这个是再往下它经历了什么啊,我不知道大家。理解这个吗?我现在讲到这理解吗。理解理解就反正这也没什么可理解,其实就是我告诉大家的,对吧。是我告诉大家一个一个一个东西啊,就是你记住这个有这么一个过程啊,实际上是我们Java后面跟的是一个类名,这个类名跟上之后呢,我们就直接敲一个回车,敲一下回车之后呢,它会启动加虚拟机,加虚拟机启动之后它会启动类加载器,类加载器干啥呀?类加载器它会虚拟硬盘上这个类。所对应的字节码文件,那关键你看你这个类名啊,你这类名叫A,就是A点类名叫B,它就就就去找这个b.class文件,如果说是。类名是什么呀?类名是这个这个个这个F的话,它它这个就就去找一个f.class如果是test,类名是test,那就去找test class。
05:02
好,那么第三。第三步啊,类加载器,如果。在如果在硬盘上找到了。自解码文件,找到了对应的字节码文件。啊啊,就是先这么说吧,类加载器如果在硬盘上找不到吧,先说找不到的问题啊,就找不到。对应的自解码文件会报错。报什么错?有印象吗?这个错。这个图。啊,会报这个错。嗯,第三步,加载器在硬盘上找不到对应的码文件会报错,报什么错。
06:03
这个错了,找不到或无法加载类啊,那类加载器如果在硬盘上找到了对应的码文件。就找到了对应的自解码文件。啊。类加载器会将该字解码文件装载。到GM当中。GM对GM启动一个什么呀,启动一个解释器,解释器啊,启动解释器将自解码解释为。这种二进制码。啊,操作系统执行二进制码啊,和硬件交互一共就大三步啊,大三步第一就是说这个Java空格,Hello word这个敲完之后它是怎么走的,是先启动了一个Java虚拟机,Java虚拟机实际上是启动类加载器,类加载器啊,它会去硬盘上找谁啊,找我们的这个这个所对应的文件啊,但它分找到和找不到,找不到的话他就会出这个问题。
07:24
找不到就会出这个问题。啊,找到就出这个问题,那如果说他找到了,他就会执行啊,他就会执行,就是这样啊,这样执行,这样讲大家理解理解不理解。理解不理解,还没讲到关键啊,关键位置还没讲到,理解不理解,各位有没有什么疑问?呃,理解的话,打个一打个一个呗。还行是吧。就现在现在为止就是讲到这种这种级别,讲到就是本来可以这个可以不讲的,各位啊,这个可以不讲的,就是我尝试着深入的讲一讲啊,然后看看大家这个对这个有没有这个理解啊。
08:10
这个怎么算理解,就是说呃。就是说这个这个类加载器啊,就这个这个东西我怕你不理解,就是一提这个术语,就怕你对这个类加载器这块比较陌生啊,比较陌生就类加载器这个东西,它它它它是啥。所以说这块的话就是类加载器呢,呃,不是那么好理解的啊,就是我在这笼统的说了一下,类加载器是负责装载这个自解码文件的啊,自解码文件的现在我考一下大家啊,比如说Java a回车啊,呃,现在这个类加载器会去找哪个文件。会去找哪个文件。会去硬盘上找哪个文件类加载器会去硬盘上找哪个文件,哎找a.class不是找A啊,是找a.class宇阳说的对啊,哎,说的对,嗯,a.class那如果是Java,哎,Test回车啊,那如果是这样的,那他会去硬这个类加载器,会去硬盘上找哪个找哪个文件。
09:12
硬盘你懂吧,就是你电脑上的硬盘,它会找哪个文件,找test.class。啊。那加it啊,会去找t.class对。你加了hello word,它就会找hello word.class。啊,你加va对吧,你加va f f,哎,它就会找 Ff.class它就会找这个文件对。就Java f f f,它敲完回车,它就会找你硬盘上这个 FFf.class但但是呢,大家注意它它包括什么呀,找到和找不到,那如果说找不到,你看Java f FF,你看找不到就会出现那个找不到或无法加载主类,但如果说找到了,它就执行了啊Java hello word1你看没有对吧,找不到,但是Java hello word就找到了啊,你看找到了。
10:05
对,把它执行了,执行啊,你看看啊看看对吧,看一下啊hello word。是的。嗯。那么现在同学们啊,问题来了,问题来了啊。来注意听啊,注意听注意听啊,问题来了。我问你答啊,问题。默认情况下。累。加载器去硬盘上找。自己码文件的时候。默认从哪找?比如说是。对吧,哎,加va hello word执行了所一点点回到上级路径。
11:02
回到这儿。回到这D,看看下边有没有hello.class。有没有没有吧,没有,那么Java ho行不行。没有Java Java哈,行不行,告诉我这样行不行。行不行,同学们。不行吧?不行吗?来我们分析一下啊,Java这个命令后边跟一个类名。敲完回车之后,第一步是干啥?第一步是干啥?还记得那大三步吗?第一步是干啥?第一步是。启动什么?第一步是启动类加载,呃,第一步是启动Java虚拟机,Java虚拟机启动类加载器类加载器器硬盘上找哪个文件去了。
12:06
类加载器去类加载器去硬盘上找哪个文件叫hello word.class。它类加载器,类加载器是不是去。硬盘上找。Hello word.class文件。他会去找找这个文件对吧。累在一起。那么我们现在这个问题是什么呢?经过我们刚才一顿一顿测试是吧?默认情况下,类加载器去硬盘上找这个字节码文件的时候,默认是从哪找的?默认是从那儿找的?来。回车废了不行。但是我切到这个叫做CHAPTER01下边之后我再去执行。啊,对了各位,我忘了跟大家说了啊,DOS命令窗口还有个神操作,就是你之前敲过的这个命令啊,它能翻出来,你按一下那个键盘上的上下箭头,上箭头下箭头,它都可以把这个历史命令给它翻出来,你不用每次都去写。
13:09
啊这这块我我我我忘了说了啊忘了说了,来这在这补上去啊,在这补上去神操作啊来翻翻翻啊翻来那这一块DR看看我们下边有没有一个hello word.class。有没有啊,那有的话,那现在我们Java下面跟一个hello word。好,能不能执行啊,可以执行。这说明这个类加载器啊,它默认是从当前路径下。找这个自解码文件的。来问大家一个问题啊,Hello word.class行不行?来告诉我行不行,告诉我来,别迷糊啊,来告诉我这样写行不行?行不行,这样后面加个class行不行,行不行。不行。不行不行。不行。
14:00
对吧?哎,我不知道大家有没有在听课啊,有没有好好听,这个是不行的,很久很久以前我们就印证过了,Java这个命令后面只能跟类名,这已经,这不是类名,这不是类名,Java后面只能跟类名,没有别的招,只能跟类名啊,这不是类名,这不是类名啊,这不合规矩,不符合我的加法语法规则,加法语法规定的是后面只能跟类名,不能跟这个,这不是个类名啊,不是个类名,不行走,你看报错了是不是?哎,我们应该怎么做,类名是谁呀?类名是hello word呀。那敲完回头之后,它会启动一个我不说了吗?启动一个Java虚拟机,Java虚拟机又去启动这个所谓的类加载器,类加载器会去硬盘上找谁呀?因为你后面这个类名是hello word,他会去找谁呀。他实际上最后还是去找那个hello点拉怎么店去了。对,但如果说你这个是Java a的话,它类加载器就会去硬盘上找哪个文件啊,找这个a.class不说了吗?找这个a.class文件,然后如果你是Java b的话,他就会去硬上找这个b.class文件,如果你是Java f f f的话,那你找谁找硬盘上找 Ff.class文件,我们现在不是在研究一件事嘛,就是就是这个类加载器去硬盘上找这个,找这个class文件的时候,他去哪找?
15:22
他去哪找去了,他是去哪找去C盘去F盘还是去哪找去了,我们通过这个测试可以看出来,它是从当前路径下找的。因为你切回去到这到这到这到这Java hello word你执行不了啊,你找不到啊,你找不到啊对不对,你CD诶切到什么呀,这个Co里边,然后哎零呃,这个Java project,哎零二里边,然后CHAPTER01里边DN看看当前录音下有这个哎你加va hello word才可以执行啊。对吧,你回去你上级路径,你上级路径下你没有那个hello word.class那你在这块加va hello word能执行吗?你执行不了就找不到啊,找不到,所以说在这里我们得出一个结论是什么?就是默认情况下类加载器去硬盘上找这个自解码文件的时候,默认从哪里找啊。
16:17
啊。从哪找啊?哎,默认情况下啊,类加载器啊,这个东西叫class,什么class loader啊类加载器会从当前。啊,路径下。找。啊,所以现在。大家理解这个了吗?这个我是不是就可以删掉了。必须这样做,这是必须的,先记住。还不记得我们运行加法程序需要哪些步骤,第一步先使用CD命令,是不是切呀,切到这个test.class文件所在的路径啊?
17:04
然后第二步是不是才执行它呀。之前我们是不是讲过这两步?有没有印象现在知道为什么切到为什么第一步要先切到这个test.class所在的路径了吗?为什么要先切到这个文件所在的路径上,我们才能执行它,就是因为我们的类加载器默认是从哪加载啊?加载器默认是从哪加载?同学们。默认从当前路径下加载。啊,所以说我们刚才在讲这个运行的时候,我们给大家说了两步嘛,两步哪两步第一步,第一步啊,就是先用CD命令切换到test.class文件所在的路径啊,就说你一般情况下运行一个程序怎么运行啊,你打开这一般都是在这儿怎么着啊,选中,然后输入CMD敲回车,哎,你一看它是CHAPTER01 chapter01下面有hello word,诶行妥了,你可以写什么呀,哎,加吧,然后hello word,诶回车你看。
18:06
是不是这样?是这样的吗?对不对,哎,那如果说你是在加入product目录下,你在这敲的CMD好妥了,那你再加product下能不能加吗?Hello word呀。哎,就不行啊,找不到啊,你得先干啥,打开它,打开它,然后在这怎么办啊,CMD车你在零一下边,然后加va hello word,诶这个才可以的啊,才可以。所以说咱们呢,这块切换的事儿大家要注意了,为什么运行Java程序的时候,让你第一步先切换到这个class文件所在的这个位置上,然后再去执行这个Java t斯特啊,我再说一下啊,这个命令敲完回车到底发生了什么?实际上是Java后面TEST1回车,它会先启动一个所谓的Java虚拟机,Java虚拟机启动之后会启动一个类加载器,类加载器会去硬盘上找test这个类名所对应的test.class文件,是类加载器干的这个事儿,他找到这个test.class文之后,就去执行这个test class文件中的程序啊程序啊,所以说咱们第一步先切到这,然后第二步第呢。
19:25
在执行它啊,在执行,他来此处应该有疑问,来各位我看哪个同学能能能能能能提出来这个问题啊,此处应该有疑问。你可以提出哪些问题?来同学们来给给一波,给一波这个这个互动啊,给一波互动,各位告诉我,此处应该有疑问,你可以提出哪些问题?你最起码可以提出一个问题啊,我觉得就学到这儿,杜老师讲到这个地方,你应该有一个有一个疑问啊,你你应该有个什么样的疑问呢?哎,咱们同学们有没有疑问啊,在这里想一想,来发一个啊,我看看这个咱们咱们俩能不能对到一块儿啊。
20:07
不是默认情况的,默认路径可以更改不太棒了啊,太棒了程毅还有小鹏,还有别还有还有别的同学有什么疑问吗?有没有什么疑问可以设置成在哪里都能直接Java加类。讲的太清楚了,好嘞好嘞好嘞,那。这块的话,这个嗯,应该有一个疑问啊,就是说类加载器。除了可以从当前路径下加载之外,类加载器能不能给他指指,指定一个位置,能不能指定一个位置,能不能给类加载器指定一个位置,让类载器去特定的目录下加载呢?就是说能不能能不能给给谁呀,类加载器指定一个路径,指定土。一个路径。让让类加载器去指定的路径下加载。
21:07
自解码文件就是我们。我们刚才是是什么呢?就是说这个类加载器啊,他去这个硬盘上找这个字节码文件的时候,找这个文件的时候。他是从当前路径下找的,对吧?那么就是说我说此处应该有疑问,你可以提出哪些问题,我希望大家提出的问题就是这个问题。就说这个问题,就是说大家应该能够想象到,就说诶,我这个Java后面跟了这个类名回车之后,它会去当前所在的零一下去找这个点class,那能不能让类加载器去别的地方找这个文件。答案。答案,啊,可以的啊可以的。但是我们需要设置。
22:03
一个环境变量。叫做class pass又是pass,但前面多了个class。啊。所这样的话,这个环境变量我就给大家调出来,这个不对啊,跟这个没关系,怎么老出来这个hello点加va跟这个没有任没有半毛钱关系啊,你别忘了,这这是JDK的新特性,这个到时候咱们会给大家扯一扯啊,讲一讲,就现在的跟这个没关系啊,不要往这个点家伙上靠啊,就是说class是给谁指路的。Class pass是一个环境变量。是给谁指路?答案是什么?是给类加载器?啊,是给类加载器指路的。啊,类加载器止住的就class pass,它这个环境变量不是Windows的,一定要记住class pass环境变量不属于Windows操作系统啊,Class pass环境变量隶属于Java。
23:18
啊,隶属于伽va,你你不要你不要说你你你你叭叭叭说class是不是Windows操作系统,这个跟Windows操作系统没有关系啊,这个环境变量。啊,是人家Java Java特有的,是Java特有的啊,Class path环境变量是Java特有的。啊,是特有的。是Java特有的啊,Class pass等于A路径分号B路径分号C路径明白吧,哎,C路径等等等等等,你可以指定很多路径啊。不会Java命令。
24:02
冲突吧。嗯,什么意思?没太描述清楚吧?Java命令以后class不会,Java命令冲突是啥意思?冲突是什么意思?这个这个环境变量是是给这个类加载器植入的,跟谁也不冲突啊。是给类加载器植入的class pass,这是一个class pass是个环境变量,是个变量名啊,这是个变名啊,是一个变量名。啊,然后后面等号,后面这些路径啊,用分号隔开,这个是是什么呢?是变量值啊,是变量值是变量值啊开。只是一个环境变量,对,只是个环境,这个环境变量就是我要讲的接下来讲的这个环境变量吗。哎,各位,我问大家个问题啊,我问大家个问题,同学们大家都在是吧?我问大家个问题啊,Class,环境变量是必须要配的吗?我不配这个变量行不行,我刚才没配,Hello word能能能不能执行。
25:06
能不能执行,各位告诉我。可以吧?可以吧,是不是class pass环境变量是不是可以不配呀?可不可以设置成Java c hello word就能编译,不用写那么详细。不行。不行啊,Java c这个不行。这不是一条道上的啊,不是一条道上的。Java c是编译,咱们现在说是运行。不配也行,只是切来切去麻烦可以,但是特麻烦啊,就是执行比较麻烦啊,可以。哎,可以可以啊class pass,那各位尴尬了啊,尴尬了。我们把class pass配一下行吗?我们把class pass配一下啊,来,我们把class pass配置一下。
26:05
这个变量啊,这个环境变量在Windows中没有需要新建。需要新建啊,需要新建各位。啊,怎么做呀,计算机。又见。属性。高级系统设置。环境变量。啊。好,那么接下来呢,这个这个环境变量呢,我在计算机上右键有个属性,属性之后有个高级系统设置啊,有个环境变量,这里不是有个新建嘛,你看别在上面操作啊,在下面操作啊,来新建新建新建啊,这个变量名千万不能随便写啊,注意。注意。注意啊,变量名不能随意写啊,不能随意写。
27:01
大小写无所谓啊,无所谓,但必须叫做class pass。啊,你叫class pass class pass class class pass都行啊,都行,没有任何问题啊,没有任何问题,来class pass。来,各位。我把class pass配死行吗?到哪了?来。我配到。我随便,我随便。啊。这个cost。就配这个吧。把这个路径配配配到这儿啊,配到这我配一个这样的路径。嗯。来,我现在是随意配的啊,我目前是随意配置的。我这么配的啊,Class pass等于。
28:00
等于D盘cost。好,配完环境变量一定要怎么着,一定要怎么着,重启什么。重启什么各位?重启什么?一定要重启这个DOS命令窗口对吗?对,一定要重启DOS命令窗口啊,重启CMD重启。CMD啊,CMD要重启一下,来这块我点一下确定啊,点一下确定好,大家看这个环境变量就有了啊class pass等于D盘的cost来点确定点确定啊来确定之后呢,接下来把这个DOS窗口咱们来这个关了啊,来这个DOS令窗口这块退一下,然后重新再进一下,来各位告诉我,D盘我切过去啊Co CD。呃,Java product cd02啊,CD chapter,好,告诉我下边有没有hello class。
29:00
有没有,有吧,来,我们执行一下Java hello word。行不行,各位告诉我这个能不能执行。来,各位在不在告诉我这个能不能执行。能,可以能。能不能不能能。不能不能把。能能到底还是不能来敲着回着走好,找不到或无法加载主类,好,大家看看当前路径下有没有一个叫做hello word大家看。有没有有吧,但是废了,这个不能执行了,执行不了了。这个是为什么呢?大家记住了,Class pass配上这个的话,以后它只会去D盘的目录下去找。当前路径下他就不找了。
30:02
当前路径下就不找了。他不去当前路径上找了,非常重要的一个特点必须记住啊,必须记住配置了class pass等于D盘cost,这之后类加载器只会去D盘Co目录下找。某某某点class文件。不再,不再从当前路径下找了,我刚才已经测完了,各位在这你看看有没有一个东西叫hello加class,有Java hello,你好好看看还能不能执行,执行不了了。所以得出一个结论,什么结论?配还不如不配呢?
31:03
对吗,同学们。是不是感觉呵呵了哟。是不是感觉呵呵了?啊。配还不低,还不如这个。不配呢?所以大家。啊,Class pass,大家现在不用配啊,就是讲了半天告诉class不用配啊,不用配。不用啊,不用管它,不用管它啊,不用管它,Class pass不用配啊。知,知道了吗。知道的话点个一。给个一来,给个一,知道的话给个一来。对对,再从配置找这样同学们这样吧,这样我把CHAR0一下的hello word.class文件剪切,你看剪切了啊,剪切放哪呢,我放到这。
32:00
这不D盘cost吗?我这个位置有hello word.class我CHAPTER01下边还有吗?我CHAPTER0一下是不是没有这个class文件了,但是我把这个class剪切剪切到哪剪切到D盘的cos目录下放这儿了,大家想想这个能不能执行?能不能执行?告诉我能不能执行,来给个回复,能不能。能不能执行?现在我已经把那个class文件剪切走了,剪切到cos里边了,Cos放到cos下边了,放这儿了。大家告诉我,告诉我能不能现在能不能走。能是吧,走好,大家看,非常精彩啊,非常棒非常好啊,非常棒非常好,好各位结论。结论。到目前为止,Class pass,环境变量不需要配置啊,不需要配置,但你必须理解环境变量是什么用的,但你必须理解环境变量是什么。
33:05
啊是干什么的,就是说咱们该讲到的要讲到啊,要讲到来这块的话。配了class pass以后都只能在D盘找了,对,只能在D盘cos下找了啊。就你理你得理解class pass是给谁植入的,就是你你一定要理解class pass这环境,你一定要理解class pass环境变量的作用是什么啊,是给类加载器,类加载器指路的。啊,指的。但是有一点非常重要的就是它不再从当前路径加加载,就是你要是配了它就从这加载,你你你不配它还它它还行,不配的话,它从当前路径加载啊,在没有配置环境变量class pass的时候,默认从当前路径下加载。
34:00
啊,如果配置了环境变量class pass的话,就只能从指定的路径下加载啊路径下加载了。啊,所以目前不用配啊,目前不用配,如果class pass配在D盘,我创建在C盘,它就不会在C盘找了,这不是多此一举嘛,对,就是多此一举啊,多此一举。好了,那这样的话,咱们这个环境变量到目前为止,其实提到了三个环境变量啊,一个是pass,一个是Java home,一个是pass啊,但是我说了,呃,Pass是必须要配的,后面这两个都可以不配。啊。这三个环境变量pass需要配置啊啊,后面两个暂时。不配置啊,暂时不配置,但你得理解各位啊,我现在讲到这,你得理解pass干什么用的啊,Class pass是class的路径,是给类加载器指了啊是这样一个东西,好,那么现在呢?呃,咱们这个第一个程序的一个编写编译还有运行我们就结束了啊,但是这块我得恢复一下,各位我得恢复一下啊,怎么恢复啊,计算键邮件有个什么属性,完了之后有个高级系统设置,然后有环境变量,是不是把这个删掉啊,这个地方class啪,你看删了它点删除删除啊点确定,点确定啊改完环境变量之后,一定要把这个窗口怎么着啊,给它关了啊关了关了之后怎么办呀?哎,你刚才这块哎怎么办啊。
35:37
哎,你还得把这个地盘下边这个点class怎么着啊,哎,给它剪切过去放到这个地方啊,放回来放这儿啊放这,然后在这儿呢,又回来原始的状态了啊CMD敲回车啊敲回车之后呢,D看看当前录音下有没有hello class有啊,Java执行hello就可以了啊,这样就可以正常执行了,也就是绕了半天讲了半天,大家不用大大家不用动手啊。
36:01
大家不用动手,千万别配啊,别动啊,你不用动啊,就讲了半天,这个你你不用管,你不用管,就是我主要的目的是为了讲这个class pass环境变量,主要是为了讲这个事儿,这个环境变量是人家Java特有的,跟Windows操作系统是没有半毛钱关系的啊,是类加载器,类加载器,类加载器它参考class pass进行自己码查找的啊,一个环境变量啊,一个环境变量。好了,嗯,这块我们就说到这儿。
我来说两句