继承、子父类中成员属性和成员函数
| 一、继承概述:a类 extends b类 |
![]() |
|
学生和工人有一些相同属性抽取出来写进人的类中。学生、工人extends这个人的类,就相当于获取了人中的内容。 【】类和类之间产生关系学生变成人的儿子,学生就有了人的内容。想要别人的东西就得认爹。 【】抽取--继承
【】student、worker是子类,person是父类、基类 子类本身没有那些属性,继承了就有了 |
|
【】对象之间存在关系,程序员创建对象、适用对象并维护对象之间的关系,这就是开发的核心内容。 |
|
???子类如何获得父类内容,是公共共享,还是人手一套?
|
|
【】分析阶段:先写学生工人再抽取出person,开发阶段先写person再写学生工人 |
| 二、单继承和多重继承:简单说,一个儿子只能认一个爹,不能有两个爹。 |
|
【】java来自c++,因为多继承有点小问题,所以禁止多继承 简单说,一个儿子只能认一个爹,不能有两个爹。
单继承:C继承了A
多继承:C继承了A,B
多继承出现的问题:多个父类里面存在相同部分,不知道调用谁,出现不确定性 这里c执行show是打印a,还是打印b呢? 所以Java这种严谨性语言不允许多继承
|
|
【】java允许多重继承,形成单继承原则下的继承体系,
【】D抽离出C,C抽离出B,B抽离出A。 想要弄清楚功能,需要从源头了解,最基本最简单的A处了解、 想要使用功能,用最全的D
|
| 三、定义继承:A∈B,<---> B extends A |
|
【】千万不要为了提高代码复用性而继承。写继承是需要关系的,没关系千万不要继承。
【】如果仅仅因为A里面有B需要的一部分就继承,那么会把其他A不应该有的东西也装进A里面。 |
|
继承必须建立在实际所属关系上,A∈B,B extends A 狮子老虎都是猫科,猫科犬科都属于哺乳动物类。
|
| 四、子父类中成员变量特点 |
![]() |
|
【】子类父类都有相同名的变量时,子类在调用时优先调用自己的变量。 子有就不找父,优先从自己内存中找,下面打印5,5
【】用super可以代指父类,以此区分同名子类变量。可以在子类中,调用父类的同名变量。
|
|
【】持有this的是堆内存的对象成员变量和方法区非静态区的成员函数,都持有this,this含有堆内存地址指向堆内存的对象。 不持有this的是静态区的static修饰成员变量和成员方法,可以通过类名调用,也可以对象调用。 【】super代表父类空间,父类加载进来的所属空间,,就是方法区父类位置,不代表父类对象,因为代码里面就没建立父类对象 子类可以获取父类中的内容,是因为子类持有super引用 |
|
【】内存图解
【】首先main方法进栈,main内部变量z开辟空间 【】右侧new Zi(), 首先父类先加载进入方法区(子类要用父类的东西,父类不先加载内存用不了。子让父先进)之后子类加载进入方法区 【】父子都进方法区后,堆内存开始建立子类的对象(父类不建立对象,因为没有让父类建立对象的代码) 其中子类成员变量和父类成员变量都存储在子类对象中,各自分别存储。父类对象成员先开辟空间初始化为0,子类成员变量再开辟空间初始化为零。接着下一步分别初始化,父类num=4;子类num=5;子类父类成员变量都有自己标识。子类this,父类super。 【】然后对象内存地址0045赋值给栈内存变量z 【】show()进栈,持有this指向对象,输出时找到对象的子类num,父类已经通过super把父类变量存入子类对象,打印super.num=4 两个变量是有区分的。 |
| 【】这种子类父类都有同名变量的情况开发中不会出现,出现就属于严重失误。 |
|
【】子类不能直接访问父类中私有内容,也只能通过get、set方法间接访问。 父类属性private后,只能本类直接访问,外界不能直接访问。 但是子类对父类中的内容还是继承过来了,只不过存的时候有数字签名有标识,私有权限外部不能直接访问,只能通过内部方法间接访问 |
| 五、子父类中成员函数 |
|
【】main方法进栈,左侧变量z在main中开辟空间; 【】右侧new Zi(),zi extends fu,所以Fu(){}首先进入方法区,之后Zi(){}进入方法区,子持有super指向Fu 【】右侧Zi对象建立,堆内存首地址0022,赋值给栈内存z 【】z。show1(),z首先先去方法区的子类找show1,找不到通过super去方法区父类找show1, 【】然后show1进栈执行,执行完毕弹栈 【】z。show2(),z首先先去方法区的子类找show2,找到就不继续找直接运行 【】然后show2进栈执行,执行完毕弹栈 |
|
【】特殊情况 执行子类对象,如果子父类存在同名函数,在子类中找到就不继续往父类找了 和属性子父类同名一样。
|
|
【】重写:类的方法和父类的在方法名和参数列表必须一致,Y(x);至于修饰词和返回值类型可以不同,但一般直接复制过来这部分原封不动, 重写、重载在这方面一样,只关注x,y。 【】函数重写覆盖,需要子类权限大于或等于父类。 权限:public>默认权限(如void show()没有修饰符,就是默认权限) static>无静态修饰符 private属于私有,父类都不让用,没法重写,不在重写范围,不在权限讨论范围 【】所以修饰词最好直接复制过来,不用考虑权限了 |
|
【】程序升级,一般不对原代码进行直接修改,而是继承后在子类中重写,这样保证父类原代码不改变,有能有新版
【】也可以这样写:直接用父类函数,这样写的东西少。super.show();
|
|
【】总结: 1父类中的方法和属性,子类extends父类,继承就等于子类也有了 2java禁止多继承,只允许单继承,一个儿子只能有一个爹,不能有多个爹。单继承可以构成继承体系达到多继承的效果,而避免多个父类有相同部件而不确定调用哪个的问题。 3继承需要存在所属关系为前提,需要a包括b的数学所属关系。不要随便就继承, 4子类继承父类后,父类的属性部件子类调用时就会进入堆内存,父类的东西都会提供给子类堆内存建立空间。 子父类出现同名变量,在子类中找到就不继续往父类找了。除非子类里面特意指出同名属性或方法,那是父类的。super.num、super.show()。 但是子父类都会加载进入方法区,且父类由于继承关系处于提供者会先加载进入方法区,且父类属性会先于子类属性先在子类对象内开辟空间。 5super在子类里面代指父类,指向的是父类加载进入的方法区内存,父类没有在对内存建立过对象。 this引用,持有的是堆内存对象的内存地址。 6子类继承父类后,父类的方法部件子类调用时就会进入栈中,子类用什么父类在方法区就提供什么。 执行子类对象,如果子父类存在同名函数,在子类中找到就不继续往父类找了。和属性子父类同名一样。 一般软件升级,子类继承父类,会对部分方法进行重写。重写,只要方法名、参数列表一致就可以。
|

























浙公网安备 33010602011771号