继承
继承的概念
在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。例如公司中的研发部员工和维护部员工都属于员工,程序中便可以描述为研发部员工和维护部员工继承自员工,同理,JavaEE工程师和Android工程师继承自研发部员工,而维网络维护工程师和硬件维护工程师继承自维护部员工。这些员工之间会形成一个继承体系,具体如下图所示。
在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。
继承的格式&使用
格式:
class 子类 extends 父类 {}
继承的好处&注意事项
1、继承的出现提高了代码的复用性,提高软件开发效率。
2、继承的出现让类与类之间产生了关系,提供了多态的前提。
注意事项
1、在Java中,类只支持单继承,不允许多继承.
2、多个类可以继承一个父类
3、在Java中,多层继承是可以的,即一个类的父类可以再去继承另外的父类
4、子类不能继承父类的私有成员
5、子类不能继承父类的构造方法,但是可以通过super去访问
6、不要为了部分功能而去继承,必须要符合 is a 的关系
继承中的成员关系
A:成员变量
a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单
b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢?
子类的方法访问变量的查找顺序:
在子类方法的局部范围找,有就使用。
在子类的成员范围找,有就使用。
在父类的成员范围找,有就使用。
找不到,就报错。
B:构造方法
a:子类的构造方法默认会去访问父类的无参构造方法
是为了子类访问父类数据的初始化
b:父类中如果没有无参构造方法,怎么办?
子类通过super去明确调用带参构造
子类通过this调用本身的其他构造,但是一定会有一个去访问了父类的构造
让父类提供无参构造
C:成员方法
a:子类的成员方法和父类中的成员方法名称不一样,这个太简单
b:子类的成员方法和父类中的成员方法名称一样,这个怎么访问呢?
通过子类对象访问一个方法的查找顺序:
在子类中找,有就使用
在父类中找,有就使用
找不到,就报错
两个面试题:
A:Override和Overload的区别?Overload是否可以改变返回值类型?
Override是重写,是对类中方法的扩充.
Overload是重载,是指方法名相同而参数列表不同的现象.
Overload不可以改变返回值类型,因为它与返回值类型无关.
B:this和super的区别和各自的作用?
1、super()主要是对父类构造函数的调用,this()是对重载构造函数的调用
2、super()主要是在继承了父类的子类的构造函数中使用,是在不同类中的使用;
this()主要是在同一类的不同构造函数中的使用
相同点:
1、super()和this()都必须在构造函数的第一行进行调用,否则就是错误的
数据初始化的面试题
A:一个类的初始化过程
1.把对象的Class文件加载到内存
2.在栈内存为引用变量开辟空间
3.在堆内存中为对象开辟空间
4.给对象的成员变量进行默认初始化
5.给对象的成员变量进行显示初始化
6.通过构造方法给成员变量进行初始化
7.对象构造完毕,把地址值赋值给引用变量
B:子父类的构造执行过程
会先调用子类的构造函数,然后再调用父类的构造函数,如果父类的构造函数足够多,会一
直调用到最终的父类构造函数,函数调用时使用栈空间,采用先进栈后出栈的原则,因此,最
先进栈的是子类的构造函数,最先出栈(也就是最先执行)的是最终父类的构造函数.
C:分层初始化
抽象类
抽象类-产生
但是有的时候,某个父类只是知道子类应该包含怎么样的方法,但是无法准确知道子类如何实现这些方法。比如一个图形类应该有一个求周长的方法,但是不同的图形求周长的算法不一样。那该怎么办呢?
分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。
抽象类&抽象方法的定义
抽象方法定义的格式:
public abstract 返回值类型 方法名(参数);
抽象类定义的格式:
abstract class 类名 {
}
抽象类的特点:
1、抽象类和抽象方法都需要被abstract修饰。
2、抽象类不可以直接创建对象,原因:调用抽象方法没有意义。
3、抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
4、抽象类的子类
a:是一个抽象类。
b:是一个具体类。这个类必须重写抽象类中的所有抽象方法。
抽象类的成员特点
A:成员变量
有变量,有常量
B:构造方法
有构造方法
C:成员方法
有抽象,有非抽象
抽象类的细节问题:
1、抽象类一定是个父类?
是的,因为不断抽取而来的。
2、抽象类中是否可以不定义抽象方法。
是可以的,那这个抽象类的存在到底有什么意义呢?
不让该类创建对象
3、抽象类有构造方法,不能实例化,那么构造方法有什么用?
用于子类访问父类数据的初始化
4、抽象关键字abstract不可以和哪些关键字共存?
1)private:私有的方法子类是无法继承到的,也不存在覆盖,
而abstract和private一起使用修饰方法,abstract既要子类去实现这个方法,
而private修饰子类根本无法得到父类这个方法。互相矛盾【abstract和private不能一起使用】。
2)final
3)static
来源:CSDN
作者:给我出个香炉吧!
链接:https://blog.csdn.net/weixin_43912384/article/details/103916170