00:00
那么class loader呢,我们说完以后,接下来呢,我们来看一下下一个问题,这个呢叫创建运行实类的对象,那这个知识呢,是需要大家掌握的,相当于我们有了大的class实例以后,后边呢,你能干什么事儿呢?来我们来展开说明,这呢是我们做的第一个事儿,创建运行实类的对象。运行实类在咱们刚才举的这些例子当中啊,其实就相当于咱们拿person类去举例子的,加载到内存中的这个person类,咱们就把它称作叫运行实类,现在呢,我们想创建它的对象,注意这个时候呢,不是通过new加构造器的方式,而是呢通过反射的方式。啊,这块我们来写这样的一个例子,那这块我还写到这个Java下新建一个class,我们就叫做new instance的一个测试,这个代码呢叫通过这个反射,通过反射呢,我们去创建呃,对应的运行时类的对象,哎,这呢叫对应的就是你这个大的class,你对应的是哪个运行时类,你就只能创建那个类的对象。
01:16
好,下面我们来写这个代码,那首先要想创建运行实力的对象,我们提到了大的class呢,是一个源头,必须先得有一个大的class。哎,比方我还叫class了,右边呢,是我们获取它实例的方式,讲了好几种是吧,那这个咱们用哪种都可以啊,那我就先用这种了。好,获取到了,获取到以后怎么创建大的class,这个这个对应的person类的实例啊,诶,我们这个class啊,它有一个方法就叫做new instance叫new instance啊,它呢还抛异常,那暂时这异常我们也先Rose一下啊,还抛还抛俩哈,哎这样我们就用了一个instance,然后al enter,哎,这呢就帮我们生成这个对象啊obg。
02:08
这个对象其实就是我们造的person类的对象。啊,这块你看我们out一下啊,我这直接写obj咱们运行。你看这时候呢,出来的你就知道,哎,确实是我们的person类的对象啊,那压呢,你在这个位置实际上是不是可以做一个强转,哎就这样person啊,我这写OBD不变了,这样做一个强转这样就成。哎,这就强了啊嗯,这呢是咱们其实是没有用泛型的啊,要用泛型的话呢,咱知道这个大的class在这个位置,其实你可以指明是person的,这个一旦指明是person以后,那实际上我们这块new instance的时候呢,它的返回值自动的就识别为是个person。哎,这个应该好理解,就像咱们讲这个这个集合一样,我这块的话呢,在release当中。
03:04
而类呢,咱们一开始假设造对象的时候没有指明泛型,你往里填的时候呢是object get的时候呢也是object,但是你指明的是,比如诶,我们往里边填的是person,那你爱的时候呢是person get的时候呢也是person,哎,这个呢,就是哎,这个类的泛型决定了我们这个get instant这个方法的返回值。啊,这就person了,就省着你做强转了啊,就这样一个小点。好,这呢我们提到了一个方法,哎,就是new instance,这呢我把它写成一个多行注释,哎,New instance,那这个方法的作用我们就相当于是叫创建,哎,调用此方法。调用此方法创建对应的运行实例的对象。这个运营实类就是我们这个person类。
04:00
那你不能说这个这个你这对应的是person类的这样一个大的class的实例,你这块呢,New ince想造一个字符串在开玩笑呢,哎,你这个呢,指向呢,就是我们方法区里边的这个类啊,所以我们调这个方法呢,造的也是这个类的对象啊,这是一个问题,那接下来大家去想我们通过这个方法调的。可能有同学会想说呢,我们造对象呢,以前都是通过new加构造器的方式去造对象,现在呢,通过一个方法就能掉了,那是不是说呢,我们造对象可以不用构造器,还可以有别的方式呢?啊有吗?没有对没有啊,那要这么说的话呢,以前咱们说这个,比如说我们呃有某呃或者或者或者怎么说呀,咱们上午不是早上说了一个那个pass嘛,是吧,这个pass呢,是带S的,还有这个不带S的这个pass,我们通过这个pass呢,我去呃这个调了一个方法,获取了一个它的实例。
05:03
你不能在这去讲啊,那是不是不到不用构造器还可以去造对象啊,其实本质上来讲的话呢,我们调了一个静态方法,其实方法里边呢,是不是还会用构造器啊,哎,只是呢,我们用一个方法的形式呢,给它封装起来了,仅此而已,那现在呢,我们调这个new incens,我们说呀,实际上调的还是咱们类的构造器,那进而呢,肯定是person类了,那问你说掉的是person类的什么构造器啊?对,通过我们这个结果来看,是不是像掉到空餐构导器,那你要想证明这个事其实也非常的简单,你在这个person里边,这呢是咱们的空参构造器找一下啊,这儿我里边写句话。那我们就写一个这个person这样。这是一个构造器了,那回过来呢,咱们再重新的跑一下。你看我们这个CL的语句呢,有没有执行。看就行了,哎,通过这个呢,我们想说明一个问题啊,咱们只要是造对象都得是用构造器来造。
06:06
只是说呢,你看到这个形式上有区别了,有的是调方法的,有的是直接扭加构造器的方式,本质上来讲,只要造对象就得用构造器,也只有过道器才可以造对象。啊,这是一个,另外咱们这个new方法,我们说到了它呢内部。那我们说这个内部是调用了这个运行时内的空参的构造器。啊,这呢,大家要注意。哎,调用了空三构造器,那言外之意,我要是person类没有空三构造器了。这是不是就麻烦了,你看我们在执行,你看他这不是刚才咱们不是说抛了异常吗?这异常呢,就专门给你这个这个准备的啊。哎,说了找不到合适的构造器,那这写到这了,我们看这了啊,这还没报啊,报到这儿了,哎这呢就相当于告诉我们说你这个失败了啊失败了,哎就是有这样的一个问题,那我们就要求要想用这个new instance,咱们必须呢去提供这构造器,这是第一个点,还有一个点,你说我这构造器权限,诶先写成这样吧。
07:19
相当于是一个默认权限,我们试一下。你看OK是吧,那那默认权限行,那我再换一个比他再小一点的private。那是不是又错了,哎说这个你访问的是个private了,不行不行了,就哎这错了啊,那这块呢,它报到这是咱这写的是一个单元测试方法啊,没方法的话呢,就把这个异常呢给抛出来了,就啊那你看我们刚才写的这里边啊,这这我们注入掉以后,刚才那个代码其他位置还有问题了啊先把这个改回去。行,再打开咱们说的这个事儿。
08:00
咱们刚才呢,在这个方法调用的时候,你发现它会有两个异常,你看这个具体异常的这个名字啊,Instant啊,这呢是不是就实例化的时候,异常它呢,想表明的就是说,当你要是没有空间构造器,它就会抛这个异常前面一个。啊,非法的access exception。非法访问就是说比如说人家是个私有的,你现在非要访问,这叫非法访问,那他呢,想描述的就是你这个权限修饰符权限不够的问题。啊,只要呢,这两个都不满足,或者有一个不满足,他就都会报这样的异常。那言外之意,要想我们这个方法能够正常的执行,哎,我们需要满足啊说啊要想此方法啊,正常的创建,哎,这个运营实例的对象。哎,我们说要求第一个点运行室内,哎,必须提供空餐的构造器,这是第一个,第二个,哎,我们要求这个空餐的构造器的访问权限,嗯,其实也没有说非得是public的啊,但至少你这个访问权限是不是得够啊。
09:14
嗯,访问权限。哎,这个叫得go,这个得go是啥意思呢?就是你按照咱们说的,你比如说这个默认权限呢,那你在包内访问是吧?啊,你要是这个这个protected呢,诶不是一个包的,但是子类也可以访问,就原来能能访问的时候,你想访问了这块呢,你也得得够啊,当然了,咱们说通常设置为这个public的。哎,你就记住这个事儿就行了。哎,这也是咱们讲这个渣B的时候说呢,通常我们一个类当中,咱们都爱去提供一个空餐的构造器,为什么非要提供一个空餐构造器呢?这呢其实就是一种情境,有可能我们在反射的时候,或者说呢,再往上一层啊,有可能我们在后边呢,大家学框架的时候呢,这个框架的底层就要用到反射干什么呢?帮你造这个扎宾的对象,通常咱们通过反射造对象的时候都爱这样写。
10:16
兜外呢,是造一个空参的这个这个调空餐的过导器,造一个对象,你要是有属性,我们后边呢,再通过调属性的方式给你去属性赋值,所以都要调的是它,那你要调它可以保证你得有,而且权限得够,所以咱们在讲扎B的时候呢,提过说呢,诶扎B里边必须要提供一个空餐的权限为public的构造器,就这样个原因啊,那其实除了这个原因之外呢,咱们还提到一个事儿,就是这是负类,这是此类,此类呢,咱们要不写构造器,或者你写了构造器没有显示的写这次或super的话呢,是不是相当于都是super空啊,哎,它默认的也要调super空,那你要是不提供这个副类中的一个空单构造器,它这呢也会,哎报错,你必须得显示的这次或super了。
11:07
哎,通过这呢,也相当于说明,哎,我们在一个类当中,最好呢,去提供一个空参的构造期啊,那这块呢,我们相当于又额外的说这个事儿啊,说我们通常。在这个渣病中。或者或者不能叫通常了,应该说在这个在扎病中要求。哎,要求呢,去提供一个叫public。空间构造器啊原因啊,原因这块呢,提到两个,第一个便于我们通过反射啊去创建运行实类的对象。哎,这是一个,然后第二个呢,哎,我们说便于。哎,这个子类继承父类时,哎,或者要继承此运行十类时啊。
12:06
啊,这个默认调用这个修空时啊,保证这个副类由此构造器。行,就这样的这个事情好这呢,我们就把这个点呢,就说清楚了啊,那后续呢,咱们说通过反射可以做很多事儿,那么创建运行实类的对象这个事儿,只要用反射,基本上咱们都会用这个事儿。啊,而造对象这个事儿里边,诶,我们95%以上都是调的这个方法,其实除了这种方法之外呢,还有别的方式哈,咱们在上午一开始给大家去演示关于这个,呃,反射在使用的时候呢,这不是咱们也调过这个指定的某一个构造器啊,这游写的啊,就在这里啊。你看这是不是我们也这个调过指定的某一个构造器啊,我调了是不是string这个参数的一个构造器,那上面呢,咱们还调了一下这个是string和int这个参数的构造器,但是这种方式呢,咱们用的比较少。
13:11
咱们用的比较多的呢,还是去直接来调一下,叫new instance。你想想为什么呀?为啥呀?就相当于咱们在创建类的对象的时候,都习惯去用那个空餐的轨道器,不爱用那些代餐的。为啥?嗯,因为代餐的话呢。咱们现在其实后边呢,咱们就都希望写一些通用的一些方法了,嗯,你像这个类呢,有可能是叫person,这个类呢叫customer,这个类呢叫user啊,这又有其他的一些类,我们去调代餐的,是不是有可能他们参数都完全不一样啊。哎,有一个参数的,人家这个参数叫string,你这有个参数的叫int,这个参数呢,是别的类型。
14:02
那代餐的呢?那情况各式各样的。那咱们要想写一个通用的创建运行实力的对象的这个事儿其实有困难,那不妨呢,咱们是不是让你们都有一个空三的构造器,我就直接用空三的构造器这个方法呢?这个声明是不是,呃,方法这个代码是不是就完全一样的?哎,我就这样去写了。啊,这样写完以后,那你要是有属性,那我再去看看你具体是什么类,哎,我去调你这个属性啊,去给你赋值啊是这样个原因啊,那先这样体会一下,后边呢慢慢来啊这呢是我们说的,呃,有了class实例以后啊,有了class这个实力以后呢,我们能做的第一个事情。
我来说两句