00:00
大家好,我是海波老师,我们继续来讲,加我的访问权限,我们来拷贝一下来,我们复制,然后写上一个19。然后点击OK,点击完成以后,把里面的东西啊,咱们都去掉,然后把它呢,我们也给它去掉,然后接下来把它我们也去掉就可以了,咱们前面给大家讲了,我们的属性呢,我们的方法呀,以及我们的类呢,都可以使用四种不同的访问权限,但其实啊,构造方法也是可以使用这四种权限的,大家看一下,我们来写上,我们在这里写上class,我们就叫U19啊好了,我写完以后,现在呢,我给我们当前的这个类啊,准备不同权限的,我们的构造方法,我这里写上一个叫。然后写上U19,我这么写完了以后什么意思啊,同学们,很简单,这个构造方法只能在当前类中使用,你在外面是没法用的,所以我写上叫U19,写个U等于new,我们叫U19,你会发现你根本就用不了,为什么用不了?因为它的权限已经给他限制住了,诶老师呀,那我们现在把它去掉,你去掉以后不就是包访问权限吗?你当前的这个类跟我这个类他们俩在同一个包里面,那所以同一个包中的类我当然就可以访问了,对不对,没有任何的问题,所以这个是对的,那好,我再来一个,我们叫做protected,好,这个也没有问题,因为受保护的权限的前提条件就是同类和同胞,所以只要他俩同胞,这个也是可以用的。那还有一个就是public了,这个就没得说了啊,那么其实啊,咱们再补充一下,我们前面讲过了,如果一个类没有声明任何的构造方法的话,Java讯机给他默认提供的就是公共的无参的构造方法。因为咱们。
01:40
之前啊,没给大家讲访问权限,所以咱们当时就没有提到这个PA对吧,但是我们现在就要提一下了,我们默认的无参的构造方法说的其实就是它,而我们加va虚拟机帮咱们省略的也是它,所以咱们这里补充一下我们Java虚拟机,Java虚拟机它默认给类提供的构造方法,它其实就是公共的。
02:04
无参的构造方法。我们当时啊,用文字的方式给大家写了,但是没有演示过对吧,那现在咱们就说一下就可以了,其实别的权限都还好,就是那个pro比较特殊,为什么呢?因为你想用你用不了啊,你像我们别的防问权限吧,什么同包啊,什么我们的子类啊都能用,对不对,最起码你有用的机会,如果你写上一个就很奇怪了,为什么呢?因为在外面根本就用不了。诶,那我都不让别人用,那你说我创建这么一个类,我的目的是什么呢?所以这里就得给大家解释一下了,有这么几种情况,第一种就是类的构造过程比较复杂,而且呢要经历多个步骤,如果让外部呢,直接可以构建对象的话呢,那么就可能会缺失下一些必要的东西,那么导致对象使用时就可能会出现问题。那么这是第一种情况,第二种情况就是呢,对象比较消耗资源,他比如啊占用了较大的内存空间,他不想在外部呢,频繁的创建,甚至在整个应用程序当中,这个对象啊,它只创建一份,我不想让别人频繁的去new,频繁去new,你只要new就会创建一个对象,但是每个对象这样的空间太大了,浪费我的资源,这个就不好了,所以呢,我们这个时候就会考虑用我们的pro,所以咱们这里说一下两种情况,第一种。
03:22
就是类的创建过程复杂。第一种,那么第二种呢,就是消耗资源。类的对象它消耗资源对吧,你大量的创建对象,你的资源消耗就会比较多嘛,对吧,就是这个意思啊,这个说白了以后,我们当前的这个类就采用了private来修饰,诶那你外面不让用,你里面可不可以用呢?并且呢,你不也说了吗?我们需要在外部使用这个对象,但是呢,又不能频繁创建,那怎么办呀?诶我的想法就是我在内部呀,我给它定义一个方法,我叫public,然后呢,写上叫U19,给他一个方法叫get instance什么意思呀,获取当前类型的对象。
04:05
我就这么写,写完了以后不就可以了吗?也就意味着把这个给它注掉,注掉以后我把U19我放过来,然后呢,把这个方法我,哎,不对哪不对了,你这个方法大家想想,你是一个成员方法,你得拗出对象来才能用吧,那你要这么做的话,完了不行,为什么不行?因为你当前的这个构造方法是私有化的,你根本就没有办法构造对象,你怎么调这个方法?我调这个方法是为了获取对象,可是你没有对象,你调不了这个方法,一个我们的死循环对不对?怎么办?很简单呀,你这里加上一个叫static不就行了吗?你加上它以后,那我通过类名不就可以访问了吗?所以把这个呢,我们拿过来就可以了,诶同学们有没有发现我这么写就行了,但是你这么写完以后我不说了吗?你这里是需要返回对象的呀,我写个new,然后把U19拿过来。
05:02
诶,老师,那这么写是不是就可以了呢?来我们打印一下点开。我们点一下啊,咱们点一下叫VR回车,回车以后你当前就能够得到我们的对象,诶老师,那这种方式是不是就可以了呢?好像可以了,但是告诉大家有问题,问题在于他根本就没有解决咱们之前那种消耗资源的问题,我们为什么给这个类的构造方法添加一个私有的权限呀,不就希望外部不要频繁的去拗吗?但大家想想,如果你频繁的调这个方法的话,比方说咱们举个例子。你这么调的话,不还是new吗?你每调用一个你new一个,每调用一个new一个,那跟我们直接new有什么区别呢?所以啊,我们的这个对象你可以创建,但是不要创建太多,我希望这个方法呢,你不管调用多少次,你应该得到的是同一个对象,我希望做到这一点,那这个怎么做呢?这个呀,咱们就得做判断了,也就是说这个对象你是不是曾经已经创建过,如果你创建过的话,就不要再创建了。
06:04
那怎么办?我就在这个类里面,我添加一个属性,我们写上它,咱们叫pro,然后呢,写上一个叫U19,好了,写上U19它等于,那我这么写,你这么写完了以后大家想一想,我只要判断我的这个对象它是否存在就行了,所以我拷贝一下,我写上它,我们这里写上if,如果你当前的这个对象它等于空。诶。怎么这里标红了呀,什么意思?嗯,怎么这里好像不太对呢,大家还记得吗?我们讲过,我们这里是一个成员属性吧,这是一个静态方法吧,静态方法能不能直接访问成员的属性,不行吧,反过来可以,反过来成员方法可以访问静态属性,但是我们的静态方法是不能访问成员属性的,咱们讲过吧,所以这里呢,我们要加上一个叫static关键字放过来,放过来以后你这样写就没问题了,如果这个对象为空怎么办?给它谬一个出来,所以它就等于new,诶,我们叫U19,我们放过来你这样写的话就可以了,然后呢,你返回就别返回new了,你就返回它不就可以了吗?对不对?哎,你这么写就行了。
07:20
你这么写完了以后,这就意味着我们不管你调用多少次,你的对象应该是完全相同的,所以呢,我们写上一个一,写上一个二,写个三,写个四啊写个五,写个六,好我现在呢,随便找两个对象,看看它俩相不相等,我们判断两个对象相不相等呢,我们有两种方式,我们的第一种方式呢,是我们的叫做它直接拷贝过来,和咱们这里用双等号,咱们比较一下。这个双等号呢,比较的是我们当前两个对象的那个地址,我们的引用对象的地址,它俩相不相等,如果是同一个对象,它俩应该是相等的,所以我运行运行以后,你看结果,你会发现没有任何的问题。除了这个以外,其实还有一个方法叫点es.es方法,这个方法也是判断两个对象相不相等,其实我们当前情况下依然是判断两个对象的内存地址相不相等,所以我运行运行以后你看结果,你会发现它其实还是相等的。你看这种代码的编写方式啊,其实就是为了在整个应用程序中,我们的对象只存在一份儿,所以写这种代码就是一种套路,也就是说只要我们当前按照这个思路来写的话,我们就能够保证我们当前的对象它只有一个,我们将有套路的代码编写方式啊,就称之为叫代码的设计模式,而咱们当前这种写法呢,有一个特定的模式名称,我们称之为叫做单例模式,但其实啊,咱们的代码呢,在多线程场景下。
08:47
会出现问题,这个咱们暂时就不介绍了,我们这里主要是给大家讲解基本的思路和对应的权限语法。如果大家想要了解设计模式的相关内容,请查看上硅谷官网完整的Java视频。
我来说两句