00:00
大家好,我是海波老师,我们之前要给大家讲了一下Java面向对象语法中的静态语方,我们接下来呢,给大家讲一下我们这个静态语法使用上一些需要注意的地方。首先我们从底层数据存储的角度,我们需要给大家区分一下它们存储位置的区别,咱们之前给大家讲过,Java内存当中主要分三块区域来存储数据,我们的第一块呢叫做占,第二块叫做堆,第三块我们称之为叫圆空间,其实啊,我们这里还有另外一个称呼,我们称之为叫方法区。但是我们之前讲的时候为什么没有提到呢?是因为这个方法区啊,它从名字上有个方法的概念,它容易跟我们占空间所存储的方法呢,给它混淆了,我们担心啊,大家可能会误会说这个方法区里面存的是方法对吧?所以咱们当时是没有提的,那么这里给大家解释一下,咱们这个圆空间其实也叫方法区,大家知道就可以了啊,那么每块内存呢,它们存储的东西是不一样的,比方说咱们的占内存这块,占内存当中我们这个蓝色小方块里面,它存储的就是我们的方法的执行战争啊,方法在执行的时候会有一个内存空间给它放进去,咱们称之为叫做方法的战争啊,这个大家知道就是一个内存空间就可以了,那个内存空间当中就会存储的我们的执行指令和咱们当前的变量里面都是有的啊,然后呢,我们这个堆内存当中啊,它存储的就是我们创建的对象,比方说你你有一个对象在咱们当前的堆里面就会创建出来,就是这个意思啊,还有呢,就是我们当前的这个方法区,或者叫圆空间它里面。
01:30
存储的是我们类的信息,好了,这个给大家介绍完以后,我们把它复制一下,复制完成以后咱们来回去,咱们在后面。后面呢,我们就要给大家解释一下,我们当前啊,我们讲了一个叫静态的语法,那么静态的语法的话,那么我们静态的属性啊,我们存在哪里,我们成员的属性我们放在哪里,我们普通的变量我们放在哪里,这里需要给大家介绍一下,首先占内存中存储的就是我们的变量,所以它我们就写上变量就可以了,而我们的堆当中啊,记住了这个是我们的对象,所以跟对象相关的都会在这里面存的什么东西啊,我们称之为叫做我们的成员属性。
02:11
我们成员属性啊,就是在我们对象当中,但是你要记住了,我们还有个叫静态属性呢,那么静态属性跟对象没有任何的关系,所以它不会存在这里,它会存在咱们当前的这个地方,咱们称之为叫做静态属性,所以啊,我们从内存的角度,把它的存储空间呢,给大家稍微的区分一下,这个是很重要的啊,那么接下来咱们说一下静态方法和成员方法的关系,咱们这里想一想。我们在创建对象的时候,是不是要先有类的信息,然后再根据类的信息去创建我的对象啊,比方说你的父类是什么,你有哪些属性,你有哪些方法,我不都得提前准备好吗?准备好了以后,当我构建对象的时候,不就直接拿过来用嘛,对不对?所以从这个角度来讲的话,我们是先有类,再有对象,这个大家能不能明白,如果你能明白的话,那就说明我们方法之间它的调用关系大家就能明白了。回过头来咱们看咱们的程序,所以我这里呢,我们拷贝一下,拷贝以后呢,我写上一个叫做下划线一。
03:13
然后呢,我点击OK,点击OK以后,我把这个地方写上一个下划线一,然后把这些地方我们全都给它去掉,去掉以后呢,我们写上它,咱们称之为叫做静态好了,然后呢,我把下面这个东西我也都不要,不要了,以后呢,我这个word先保留吧,我先给大家写上一个class,我们叫做test,诶我这么写,写完了以后什么意思啊,同学们给大家解释一下,我现在呢,就准备写两个方法,一个叫做我们叫test,没问题吧,我再来一个叫VO,我写成一个叫TEST1OK好了,我有两个方法,但是呢,我的第二个呢,我加上一个static,这个大家能不能明白,一个是成员方法,一个是静态方法,一个跟对象相关,一个跟我当前的test类型相关。好,我在准备两个属性,一个我们叫string name,这个使用name呢,表述的是成员属性,我再来一个,我写上static,叫做使,我们就叫做性别吧,好,这么写。
04:10
写完了以后,同学们我们会发现我们这里呢,有两个属性,一个是成员,一个是静态,两个方法,一个是成员,一个是静态,我接下来就给大家演示一下他们之间的关系,所谓的关系啊,就是说我能访问什么,我不能访问什么,所以把这个去掉。去掉以后大家看一下,首先我们需要明确一点,就是我们先有类。再有我们的对象,这个是一定要明确这个概念好不好,同学们好了,明确这个概念以后,那么现在呢,我去构造对象,我们叫test,好,我们写个T,它等于我们new test,行了,写完了以后,同学们注意了,我当前我们T点,我们这个叫做test,没有任何的问题,对不对?诶这么写是可以的,为什么这么写可以,因为我们这个方法它就属于对象的成员方法,所以这么调没有任何的问题。
05:01
但是呢,我先再写一个叫t.TEST1,你这么写你会发现也没问题,哎,老师,那这是为什么呢?你不说了吗?这个方法是成员方法,所以这个对象,诶我能调这个方法,但是你的TEST1不是我们的成员方法呀,它是一个静态方法,跟对象无关呀,跟对象无关的情况下,那么我们应该跟类型相关,所以它的准确写法不应该是test点,咱们叫TEST1吗?你这么写才是对的呀,怎么这么写它也对呢?诶老师会不会执行出错呢,咱们试一试啊,我在这个地方呢,我们写上它,咱们叫做什么呢?Test点点点,然后把这个拷贝,拷贝以后呢,我放到这边,我叫TEST1就可以了,好了,同学们我先写完了,写完了以后我运行一下,你会发现我们的test会打印一遍,但是我的test一会打印两遍,说明程序是正确的。那既然程序是正确的话,那怎么解释呢?其实非常简单,你只要把这句话想明白了就行了,为什么?因为我们只要有了对象的话,我就问你他有没有类,有没有。
06:07
有吧,如果有类的话,那么我通过对象不就得到了类吗?有了类,它里面的这个方法我不就能访问吗?不就这么简单吗?先有的类,再有的对象,只要有对象了,类一定是存在的,我直接去访问就没有任何问题,对不对?这个我相信大家能够明白,如果这个能明白的话,那么就意味着我在我们当前的成员方法中,我们调用静态方法应该也是可以的,所以我们来我写上它叫TEST1,诶,你会发现这个是没有任何问题的,为什么它是一个成员方法,它是一个静态方法,我们有成员的时候,类的信息一定是存在的,那么它的方法也都一定存在,所以啊,我们把我们这个给它注掉。你做掉以后,我把这个咱们全做掉,咱们只是给大家演示一下这个方法,好吧,同学们来我运行,运行以后看结果。你会发现TEST1执行了,为什么执行了,因为我调这个方法,它在里面调用了静态方法,没问题,诶那我访问这个静态属性可不可以,那肯定可以啊,所以我们来访问一下,咱们叫做打印,打印呢叫做性别对吧,但是我这没性别啊,所以给它来写上一个咱们叫做T点我的性别,好,写完以后给他一个女吧,好了,写上。
07:20
写完了以后,大家有没有发现我们这么写是完全正确的,我运行运行以后看结果,你会发现我们确实打印了,说明什么问题,说明我们的静态属性通过对象也可以访问,能不能明白啊,同学们,那么能明白的话,我们的成员方法里面去访问静态方法没问题,访问静态属性也没有问题,好了,咱们补充上啊,来写上它。我们的成员方法,它是可以访问我们的静态属性和静态方法的,当然了,你成员属性肯定就能访问嘛,但是我也能访问静态属性和静态方法,对不对,这个是对的,哎,老师,那反过来行不行呢?什么意思啊,我现在把这个注掉啊,把它也做掉,把这个打开,打开以后我把这个地方给它去掉干嘛呀,我在我的TEST1里面,我去调用这个test,在静态方法当中,我去访问我的成员方法。
08:12
有没有发现不行啊。诶,老师这怎么报错了呢?你刚才能调用,怎么这不能调用呢?很简单,还是那句话,我们是先有类,再有对象,那么就意味着当你有了类以后,你跟类相关的这些行为就已经能用了,对不对?可是同学们你累有了,你一定有对象吗?如果你不拗的话,这个对象是不是就不会出现?所以从语法的角度来讲的话,我们是先有了类,就有了它,它就可以用了,可是这个时候还可能没有对象呢,所以从语法上它是不允许这种访问方式的,我们的静态方法是不允许访问成员方法的,同样道理,你成员方法不让用,你的成员属性他也不会让用,所以我们助调,助调以后我们来,我们打印,打印什么呢?Name,你会发现这个量也是不对的,对不对,为什么?就是因为它是我们所谓的静态的方法,而你这个属性是一个成员的方法。好了,咱们补充上。
09:07
我们的静态方法。是不可以访问我们,我们的成员属性和成员方法。这个是绝对不允许的,同学们,这个大家能不能明白啊,所以啊,这个是比较特殊的,这就涉及到我们类和对象之间的关系了,好了,这个咱们说完了以后,咱们给它注掉,把这个注掉行。接下来呢,我们再给大家讲另外一个跟静态语法相关的,我们叫静态代码块,什么意思啊,我们来拷贝一下,拷贝以后呢,我写上一个二,然后呢,点击OK,把里面的东西呢,咱们先给它去掉,我先不要了。好了,去掉以后,把这个二呢,我们也给它去掉,我们也给它不要了,去掉好,那么我们去掉了以后,咱们干嘛呢?给大家讲一个叫静态代码块,大家看一下,我写上一个class,我叫U,我们的零八,然后呢,我写上它写完了以后,我写上一个叫static,写上一个我们的花括号,这个花括号就表示的是代码块,什么叫代码块啊,里面能写我们代码的这一块区域,我们就之为叫代码块,这个我们称之为叫静态代码框,什么意思啊,你加了一个静态关键字嘛,里面的这个花括号的代码就可以执行,我们写上打印,打印以后呢,我们就写上它叫静态代码块执行。
10:25
好了好了,写完了以后,那这个静态代码块怎么执行呢?不知道你连个名字都没有,我咋用啊?好,那么我们不管它,咱们先来试一试,我在里面呢,给它来写上一个,我们叫做static,我们叫word写个test,行了,写完以后我在这里呢,给它来,我们叫做test,点点点,然后呢,接下来我就写上了,我叫U08,然后呢点一下叫做test。我们这么写完了以后,它不就会被打印了吗?所以我运行一下,运行以后看结果,你会发现我们当前的静态代码块它也会执行,诶老师这是为什么呢?这里就需要给大家解释一下了,之前咱们提到过啊,就是说我们的静态属性和我们的静态方法呢,是当我们这个类信息被放到里面去以后,它就有了这些属性和方法,对不对就可以使用了,但是呢,这些属性呢,是需要去调用和触发的,我希望呀,某些逻辑呢,可以当我们的这个类的信息放到里面以后,自动出发,那么这个时候就会用到这个静态代码块,所以啊,简单来讲呢,就是我们的类的信息加载完成后。
11:32
会自动调用静态代码框,你什么都不用做,只要你这个类的信息被加载完成以后,这块代码就会自动执行,你什么都不用做,诶老师啊,那我new的话行不行?比方说把这个助掉,我就写上一个new,然后呢,把这个U点零八我拿过来,拿过来以后,那我现在执行可不可以呢?可以啊,你运行之后,你会发现静态代码块它也会执行,为什么你new对象不得先有这个类吗?那有了这个类它加载完成不就会自动执行吗?对不对,就是这个意思,所以啊,我们这里的静态代码块就可以在这个场合下去做,诶老师啊,那我这个代码块里面主要写什么呢?诶,我们可以完成我们叫静态属性的初始化功能。
12:18
对吧,我有些属性呢,我希望提前初始化,我在这里也是可以完成的,没有任何的问题,诶老师,那你这个代码块只能写一遍吗?不是我们这里呢,再来拷贝,拷贝以后大家看一下我放过来,然后呢我再往下放,放完了以后我写上一个一写个二,写个三。同学们,我在这写了一个,紧跟着它写了一个,我在最后我又写了一个,记住啊,我三个代码框,所以呢,我现在运行一下,运行之后大家看结果你会发现123就是按照我们声明定义的顺序,它依次执行,记住你不管怎么写,只要你按这个声明的顺序,它就会依次执行了,诶老师啊,我们这个静态代码块啊,它是在我们类的信息加载完成之后去自动触发的。
13:04
那咱们对象有没有这种自动触发的功能呢?我告诉大家也是有的,那也是有的,什么意思啊,咱们这里说一下,这里呢,咱们说一下对象准备创建时也会自动调用代码块,但不是静态的啊,不是静态的诶那这个怎么理解呢?其实也很简单,干嘛呀,你在这儿写上一个,我们这里写上一个它我直接写上一个大括号就可以了,那这里我写上它拷贝,拷贝以后同学们看一下,我称之为就叫做我们的代码块执行,我们写上一个一,然后呢,我们复制一下,复制以后在下面我们写上一个二就可以了,就简单一点啊,就这么写,写完了以后,同学们记住,我把这个给它注掉。注掉以后。然后呢,把这个呢,我们打开,打开以后同学们,我现在是通过类名去调用我的test,所以说我们的静态方法,那么静态代码块会被执行,所以我运行一下,运行以后看结果,你会发现我们在当前当中,我们的静态代码块123执行了,这个方法也执行了,诶老师呀,那你不对呀,你的这个我们的代码框怎么没执行呢?哎,他确实没执行,是因为你没有构建对象啊。
14:14
你要构建对象的时候,它才会执行,这个大家能不能明白,所以说你得把它注掉,注掉以后你把这个打开,你打开以后你运行之后看结果,你会发现它就能够执行了,有没有发现静态代码块123,然后呢,我们创建对象的时候,我们的一和二不就有了吗?哎,所以啊,我们静态的语法呢,相对来说,对于我们来讲有些需要注意的地方,这个下来呢,大家自己去写一写,试一试,来理解一下啊好了,静态语法咱们就讲到这里。
我来说两句