第九章 继承、抽象类

旧时模样 提交于 2020-01-14 05:04:31

继承

继承的概念

在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。例如公司中的研发部员工和维护部员工都属于员工,程序中便可以描述为研发部员工和维护部员工继承自员工,同理,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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!