一、继承
1. 概述
- 继承是面向对象的重要特征之一,当多个类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那多个类中无需再定义这些属性和行为,只需继承那个单独的类即可。
- 单独的类称为父类或超类
- 多个类称为子类
- 例如:
- 猫和老虎都是属于猫科动物。
- 描述猫、老虎这些对象所创建的类,就是子类;
- 而描述猫科动物这个对象所创建的类,就是父类。
- 类与类之间存在了继承关系,子类可以直接访问父类中非私有的属性和行为,代码中通过 extends 关键字来表示继承关系。
- 例如:class Son extends Father{}//代码中的书写格式
- 注:
- 千万不能为了获取其他类中的功能,简化代码而去继承。
- 必须是类与类之间有所属关系才能继承。
- 这种所属关系的表示为 is a
2. 特点
1. 提高了代码的复用性。
2. 让类与类之间产生了关系,是多态的前提。
- 注:
- Java 语言中只支持单继承,不支持多继承。
- Java 虽然不支持多继承,但是保留了类似的机制,并且以另一种形式来体现,也就是多实现。
- 只能单继承的原因?
- 因为类与类多继承的话,容易产生安全隐患。
- 例如:当多个父类中定义了相同的功能,但功能的内容不相同时,子类对象就无法确定要运行哪一个父类的功能了。
3. 应用
- Java 中虽然不支持多继承,但是支持多层继承,也就是继承体系。
- 例如:儿子继承父亲,父亲继承爷爷等。
- class A{}
- class B extends A{}
- class C extends B{}
- 如何使用继承体系中的功能?
- 想要使用继承体系,先要查询继承体系中父类的描述,因为父类中定义的是该继承体系中的共性功能,了解共性功能后,就可以知道该体系的基本功能,这个继承体系就基本可以使用了。
- 具体调用时,需要先创建最子类的对象,原因是?
- 有可能父类不能创建对象;
- 创建子类对象可以使用更多的功能,包括基本的父类共性功能,也包括子类的特有功能。
例如:
- 子父类出现后,类成员(变量、函数、构造函数)的特点:
- 变量
- 如果子类中出现非私有的同名成员变量时,子类要访问本类中的变量,用 this;子类要访问父类父类中的同名变量,用 super。
- this 和 super 的使用几乎一致,并且两者都存于方法区中。
- this 表示本类对象的引用
- super 表示父类对象的引用
- 函数 —— 重写(覆盖)
- 构造函数
- final 关键字
二、抽象
1. 概述
- 从多个事物中将共性的、本质的内容抽取出来,这就是抽象。
- 例如:狗和狼共性都是犬科,犬科就是抽象出来的概念。
- Java 中可以定义没有方法体的方法,方法的具体实现由子类实现,多个对象如果具有相同功能,但功能的具体内容有所不同,那么在抽取过程中,只抽取功能定义,未抽取功能主体内容,这样只有功能声明,没有功能主体的方法,这样的方法称为抽象方法,而含有抽象方法的类称为抽象类。
- 例如:狗和狼都有吼叫的方法,但是吼叫的内容不一样,因此抽象出来的犬科虽然有吼叫功能,但是并没有明确吼叫的实现内容细节。
- 格式:
- abstract 类名 {}
- 子类名 extends 抽象类名 {}
2. 特点
- 抽象类和抽象方法必须使用 abstract 关键字进行修饰。
- 抽象方法只有方法声明,没有方法体,定义在抽象类中。
- 格式:修饰符 abstract 返回值类型 函数名(参数列表);
- 抽象类不能被实例化,也就是说不能用 new 创建对象,抽象类是从具体事物抽取出来的,抽象类本身是不具体的,没有对应的实例。
- 例如:犬科是一个抽象的概念,真正存在的实例是狗和狼。
抽象类通过其子类进行实例化,子类必须重写(覆盖)抽象类中所有的抽象方法,子类才能实例化,否则该子类也会是抽象类。
注:抽象类中可以存在非抽象方法。
例如:
3. 抽象类与一般类
- 区别:
- 抽象类不可以实例化。
- 抽象类不能创建对象,但是也有构造函数,提供给子类实例化调用。
- 抽象类比一般类多了抽象方法,抽象类中可以定义抽象方法,也可以定义非抽象方法。
- 注:
- 抽象类中可以不定义抽象方法,使抽象类不被实例化,常用于模块设计。
- 被 abstract 修饰的函数不能同时被 private、static、final 修饰。