![](https://i-blog.csdnimg.cn/blog_migrate/8d982760b545742b497ebcae06f635e2.png)
通过这张学生表我们可以创建学生对象s1,s2
这个类里面的age成员变量没有加static修饰
![](https://i-blog.csdnimg.cn/blog_migrate/c501599cee12bec0ebc066409bf40990.png)
没有加static修饰的前变量称之为实例变量,每个对象中都会有一份他认识的这两种变量
![](https://i-blog.csdnimg.cn/blog_migrate/53832a331f42268f212f36e8603f5261.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c5bd7134377b4e7f09b1a7e88dfe1583.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b47de0d5309bc674eb4904e62f167171.png)
它会检查这个学生类里面有没有类变量
发现有类变量
他会与这个类一起加载
它会立即把这个类变量内加载到堆内存中去的
![](https://i-blog.csdnimg.cn/blog_migrate/73b20662c71a3b5617d3185792a10826.png)
name一开始里面装的是null
然后这个学生类可以去找到这个类变量内部的
然后最左边再为这个类变量的name附了个值袁华
![](https://i-blog.csdnimg.cn/blog_migrate/84ccdf12d83c4de3053d85ff4cbd03df.png)
这个学生对象里面会放实例变量age的
这个aage是属于对象的
![](https://i-blog.csdnimg.cn/blog_migrate/7d4cd2bcc2f122e0e9b78b84c336825e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1e68a67f87994f6e63a8deead9476a5e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5832acb6bbcfdd46155761c7ac9b4fea.png)
这个学生对象里面没有name,然后他会去找学生类
再通过学生类来找到这个类变量name
此时这里面的值已经是秋雅
![](https://i-blog.csdnimg.cn/blog_migrate/7aec0b8c65a6d206e9f8c4ee705025cc.png)
![](https://i-blog.csdnimg.cn/blog_migrate/81efb70f5b282cd4199a2b6424b414ff.png)
最终装的肯定也是秋雅
![](https://i-blog.csdnimg.cn/blog_migrate/51689dec979c04afe627ba738c499bc1.png)
找到这个学生对象里面的实例变量
也就是对象变量age
把里面存的值改成了23
![](https://i-blog.csdnimg.cn/blog_migrate/641a417009b13c971f613c8214a856eb.png)
把第二个学生对象里面的对象变量age
存储的值又改成了18
![](https://i-blog.csdnimg.cn/blog_migrate/c6aa58233dc8c10c1b0fcce1879ecf99.png)
此时这个里面的值是23了
![](https://i-blog.csdnimg.cn/blog_migrate/93762871982fcf12cdbf516987e82ff9.png)
还是第二个学生对象的age
这个代码他是不清楚的
所以他就给你报错啦
![](https://i-blog.csdnimg.cn/blog_migrate/e76509d59e2be8032aaee5d8d6d3ab78.png)
撒大苏打撒旦撒
![](https://i-blog.csdnimg.cn/blog_migrate/be2f5594e7034a2bca3cd6081067ef71.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0956beabf151bd74c7ccafa1ba40fe16.png)
![](https://i-blog.csdnimg.cn/blog_migrate/43cba7e52bbc085339d81e69427e211d.png)
于是他会把学生类也加载到方法区里面来执行
![](https://i-blog.csdnimg.cn/blog_migrate/c5a83bb09685045818978bd89ac9a269.png)
他会通过这个学生内找到这个print hello world
这个方法由static修饰是个类方法
它是允许用类名调的
![](https://i-blog.csdnimg.cn/blog_migrate/e695a58502ed401f0fe1167e055daeb6.png)
接着这个学生对象会指向下面这个学生类
![](https://i-blog.csdnimg.cn/blog_migrate/29a0fbac2431463fcbb7e5905ad60a81.png)
再通过这个类找到要调的是print hello world
由于这个方法是static修饰的类方法
它也是支持被对象共享访问的
于是对象调它也可以调
也会打印两行hello world
![](https://i-blog.csdnimg.cn/blog_migrate/825bab6ee2aed9a74e9cd19d3b117496.png)
print pass那是可以调的啊
那这个print pass方法里面
它会访问当前对象的这个score
成员变量里面的值
零点输出的是成绩不及格
![](https://i-blog.csdnimg.cn/blog_migrate/f7d09219d6d85f36ec99ab0e97fb26de.png)
它会通过类名到这边来
然后去找到这个print pass方法
print pass方法由于它是对象的方法
它是不允许你用内名掉的
并且这个print parse方法里面
是不是还要访问对象的那些成绩
所以啊实例方法也就是对象的方法
你只能用对象调它好了
![](https://i-blog.csdnimg.cn/blog_migrate/91624eb0d39c00f2e04ccdb51e03e553.png)
也可以访问类方法
我们不能在类方法中去访问实例变量
说明我们不能在类方法中去访问这些实力成员,因为这些实力成员它是属于对象的
你肯定要用对象来访问
![](https://i-blog.csdnimg.cn/blog_migrate/716f56317dbb2044458828c111554d5f.png)
那么当别人用类名来调这个方法的时候
而这个方法内部的this他是要拿到当前对象的
但是现在没有对象来调这个类方法
所以this是不能出现在内方法里面的
![](https://i-blog.csdnimg.cn/blog_migrate/69b727d05ee4b13ce0ee75ea07a9c65d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9ccbf8f3abbfa9c022523e7255b274d3.png)
里面这个类变量school name其实也会同时加载的
然后他会马上去执行这个静态代码块
它是可以直接去访问这个类的成员school name的
![](https://i-blog.csdnimg.cn/blog_migrate/8c75eb9ebcc72178391e82734de8d5b9.png)
再执行的这个有参数构造器的
![](https://i-blog.csdnimg.cn/blog_migrate/246c5ce9357a864678f18f07671815cc.png)
那么我们就可以在这个实例代码块里面,为这个age赋值,比如说18为啥可以在这里赋值呢
因为age是对象的变量,而实例代码块是每次创建对象的时候就会执行
那它就可以访问这个对象里面的对象变量
![](https://i-blog.csdnimg.cn/blog_migrate/be8aae6239287c6b3d1f74dc642e8308.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ded0e208f32375b55bf8db3d161d88ef.png)
![](https://i-blog.csdnimg.cn/blog_migrate/212149dee13ed795a54385d29b7403f8.png)
现在这个地方的b类它是继承了a类的,也就是说b这张设计图
它是继承了a这张设计图的,所以你在用b来new这个b对象的时候
java会用a和b这两张设计图,一起来做这个地方的b对象
也就是继承体系下b对象,此时是用多张设计图一起做出来的
当然b对象能直接访问什么成员,它也是由这两张设计图共同来决定的
这两张设计图对外暴露了什么成员,这里的b对象就可以访问什么成员
![](https://i-blog.csdnimg.cn/blog_migrate/565257cb248bbe3e9e3b8745438d98da.png)
![](https://i-blog.csdnimg.cn/blog_migrate/329bef7a12d677fc0b012750b14697a8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ee960662847c3221c7d338f42bf89d69.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a718f6fdac2e93792489da7efd8555bf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6d43b4d8e11cecc66d2aca9a7d076e65.png)
还会定义一个咨询师类,用来处理咨询师的数据
在讲师类里面我们会设计name scare,两个成员变量
下面会提供一些get set方法
在咨询师类里面,同样我们也会定义两个成员变量
一个name,一个是解答问题的总人数
下面同样也提供了一些get set方法
![](https://i-blog.csdnimg.cn/blog_migrate/19385bed8a7f764176787e31966b674c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6a5dc1f0a2c0a39fec95b8b3b33d85d3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1fbb2c1b5e1b1d5e1a81de2884d8e8b0.png)
接着我又有一个b类,这个b类里面我也写了一个method的方法,
这个method方法里面写的是复习语文
接着我们再来定义一个c类,那我就让这个c类同时继承a类和b类
接着我再用这个c类去创建一个对象
![](https://i-blog.csdnimg.cn/blog_migrate/e80c5f24dc8e87fbc26490059d7d1765.png)
那接着我们就可以用这个c对象去调用,method的方法
![](https://i-blog.csdnimg.cn/blog_migrate/22a69aa485e460abdd55183f3cd1ae2b.png)
会有我们设计的这个类以及object类
![](https://i-blog.csdnimg.cn/blog_migrate/9238b53fe8dbc1f230776806c3b85164.png)
这两个方法它调用的肯定都是父类a里面的..
重写几乎都一样
他会就近选择b类里面的这两个重写的方法
![](https://i-blog.csdnimg.cn/blog_migrate/de7148e48a04528a54908cc4de4f9a06.png)
会默认继承ob类
![](https://i-blog.csdnimg.cn/blog_migrate/82c11b3db3c86618cee4debdff772942.png)
返回的是对象的地址
![](https://i-blog.csdnimg.cn/blog_migrate/24834ab0e104151d84406872a8b0cccf.png)
调就近的重写方法
![](https://i-blog.csdnimg.cn/blog_migrate/9366771f8ae87e5f2bd27a4243c023f6.png)
它是不是也把object类里面的图方法进行了重写,它会掉自己重写
![](https://i-blog.csdnimg.cn/blog_migrate/c85f0a43f33f011bb1d04e768291a9cc.png)
![](https://i-blog.csdnimg.cn/blog_migrate/aad055ffed2129e96bb6c341fcc74b51.png)
![](https://i-blog.csdnimg.cn/blog_migrate/285c0e6b91e0fe7eda00bf02143bfe6b.png)
然后去父类里面找东西,因此直接在这个super的后面加上点name
它就可以指定去找父类里面的那个成员变量name
![](https://i-blog.csdnimg.cn/blog_migrate/63628bcdf48f4cb5db929acf83a949f7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/03bc6caa77cd81265b7147a04c286c70.png)
先定义一个父类class f
接着我到这下面来再定义一个子类class z
让这个子类去继承一下这个父类
然后到父类这里来
把他的这个无参构造器给它写出来
方便一会儿观察public f小块大块
我们也把它的构造器写出来子类
那我先写一个子类的无参构造器出来
我现在来创建一个子类z的对象出来
他会去调这个子类的无参构造器啊
说明我们在创建子类对象
这个子类对象去调查自己的无参构造器的时候
它会先去调用父类的无参构造器
然后再回来是不是执行自己这个代码
子类是会先去调用父类的无参构造器
![](https://i-blog.csdnimg.cn/blog_migrate/b3c49328355c42638d1913b46af19e72.png)
同样他也会先去调用父类的无参构造器
再回来执行自己这个有参构造器里面的代码的
子类的全部构造器它都会先调用父类的构造器,再执行自己的
其实在子类的全部构造器的第一行这里啊
它都会有一个super括号的代码的
![](https://i-blog.csdnimg.cn/blog_migrate/f8fba77b38ade747b97cdead09d78310.png)
有参数构造器一旦出来了之后
这个f类里面默认的无参构造器没有了
![](https://i-blog.csdnimg.cn/blog_migrate/51664718f365c992d40f923c2799c73c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1f04f52c03337dd3d2588994b88892af.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c3f58c4ece07130aadb057c050d61d19.png)
创建老师对象来封装一个老师的数据
引入继承之后,它实际上是由老师内这张设计图
以及人类这张设计图
就是多张设计图共同创建出来的一个老师对象
那这个老师对象也就是这个t对象里面
他肯定是包含了老师类里面的这个成变量
同时也包含了它的父类成原变量
![](https://i-blog.csdnimg.cn/blog_migrate/b4c73bd8cd4d1fdb4deae126dbaa743c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/af43e9b68ec67e1b08c91e1eaa896a1b.png)
它是由子类这张设计图在管理的啊
![](https://i-blog.csdnimg.cn/blog_migrate/8b1e2e4502afb92325596c4fdaba7e69.png)
被迫拆分成了这两个类
也就是这两张设计图了
由于被迫拆成的这两张设计图
处理对象数据的构造器
也被拆分到了这两张设计图中了
![](https://i-blog.csdnimg.cn/blog_migrate/caebec63f933172fb9def5489c648e68.png)
而处理scare的这个构造器又是放在了子类里的
所以为了把对象的数据处理完整的
子类对象在调用自己的构造器的时候
这个构造器它肯定是需要先去调用,父类的构造器,把对象里面的name和a级处理
再回来处理自己的这个skill,这样才能把对象的数据完整的处理了
![](https://i-blog.csdnimg.cn/blog_migrate/8cfff02c2a2e410cf71e43bce889aea8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0673647e9dbf393ba503c242ed0ed4ec.png)
接着呢他把这个名字李四和年龄36
![](https://i-blog.csdnimg.cn/blog_migrate/5584890c890b6b37b0531d43e052645d.png)
由于处理对象数据的构造器
它拆到了多个类里去了
所以当我们创建这个子类对象的时候
子类对象在调用子类的构造器的时候
它肯定需要先去调用它的父类的构造器
把对象里面包含的父类这部分的成员变量
先进行初始化赋值
再回到子类构造器这里来
把对象里面包含的子类
这部分的成员变量也进行初始化赋值
![](https://i-blog.csdnimg.cn/blog_migrate/b885741c0635ebee2bbaf5ef1fd454d8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e4270c06fba7aedbb16a39af2fef2a70.png)
![](https://i-blog.csdnimg.cn/blog_migrate/228e3435472e1ce7f3d80b76929f6c15.png)
认为这种情况下学生是没有填学校的啊
然后这里面呢就直接为当前这个学生对象的name
![](https://i-blog.csdnimg.cn/blog_migrate/53ec4d31abe4819fd6b000c25fd981f1.png)
为当前这个学生对象做数据的初始化赋值
![](https://i-blog.csdnimg.cn/blog_migrate/d306777f7514ab9f82461c7a61639a80.png)