继承、子父类中成员属性和成员函数

一、继承概述:a类 extends b类
image

学生和工人有一些相同属性抽取出来写进人的类中。学生、工人extends这个人的类,就相当于获取了人中的内容。

【】类和类之间产生关系学生变成人的儿子,学生就有了人的内容。想要别人的东西就得认爹。

【】抽取--继承

图片

 【】student、worker是子类,person是父类、基类

子类本身没有那些属性,继承了就有了

 

图片

 【】对象之间存在关系,程序员创建对象、适用对象并维护对象之间的关系,这就是开发的核心内容。

 ???子类如何获得父类内容,是公共共享,还是人手一套?

 

 

图片

 

【】分析阶段:先写学生工人再抽取出person,开发阶段先写person再写学生工人

 
 二、单继承和多重继承:简单说,一个儿子只能认一个爹,不能有两个爹。

【】java来自c++,因为多继承有点小问题,所以禁止多继承

简单说,一个儿子只能认一个爹,不能有两个爹。

image

单继承:C继承了A

image

多继承:C继承了A,B

image

多继承出现的问题:多个父类里面存在相同部分,不知道调用谁,出现不确定性

这里c执行show是打印a,还是打印b呢?

所以Java这种严谨性语言不允许多继承

image

【】java允许多重继承,形成单继承原则下的继承体系,

image

【】D抽离出C,C抽离出B,B抽离出A。

想要弄清楚功能,需要从源头了解,最基本最简单的A处了解、

想要使用功能,用最全的D

image

 

 
三、定义继承:A∈B,<--->  B extends A

【】千万不要为了提高代码复用性而继承。写继承是需要关系的,没关系千万不要继承。

image

【】如果仅仅因为A里面有B需要的一部分就继承,那么会把其他A不应该有的东西也装进A里面。

image

继承必须建立在实际所属关系上,A∈B,B extends A

狮子老虎都是猫科,猫科犬科都属于哺乳动物类。

image

 
 
四、子父类中成员变量特点
image

【】子类父类都有相同名的变量时,子类在调用时优先调用自己的变量。

子有就不找父,优先从自己内存中找,下面打印5,5

image

【】用super可以代指父类,以此区分同名子类变量。可以在子类中,调用父类的同名变量。

image

image

【】持有this的是堆内存的对象成员变量和方法区非静态区的成员函数,都持有this,this含有堆内存地址指向堆内存的对象。

不持有this的是静态区的static修饰成员变量和成员方法,可以通过类名调用,也可以对象调用。

【】super代表父类空间,父类加载进来的所属空间,,就是方法区父类位置,不代表父类对象,因为代码里面就没建立父类对象

子类可以获取父类中的内容,是因为子类持有super引用

【】内存图解

image

【】首先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子类继承父类后,父类的方法部件子类调用时就会进入栈中,子类用什么父类在方法区就提供什么。

执行子类对象,如果子父类存在同名函数,在子类中找到就不继续往父类找了。和属性子父类同名一样。

一般软件升级,子类继承父类,会对部分方法进行重写。重写,只要方法名、参数列表一致就可以。

 

 
 
 
posted @ 2025-09-02 15:10  ibddindonon  阅读(20)  评论(0)    收藏  举报