1、简单介绍
什么是继承?extends 其实是扩展的意思
继承是类与类之间的一种关系,对某一批类中共有的方法和属性进行共性抽取,抽取出来的这个类也就是被继承的类称之为:父类 / 基类 / 超类;继承的类称之为:子类 / 派生类
为什么要使用继承?(或者说使用继承解决了什么问题?)
提高代码复用率
继承是多态的前提,没有继承即没有多态。
继承设计规范
子类们相同特征(共性属性、共性方法)放在父类中定义,子类独有的属性和行为应该定义在子类自己里面。
为什么这样做?
如果子类的独有属性、行为定义在父类中,会导致其他子类也会得到这些属性和行为,这不符合面向对象逻辑。
2、特点
-
java 语言是单继承的,不是多继承,但是可以多层继承。
- 例如:A 继承 B,B 继承 C,C 再继承 D,……,X 继承 Object 类。
-
一个子类的直接父类是唯一的,但是一个父类可以拥有很多个子类。
- java 中所有的类都直接或间接继承自 Object(祖宗类)。
-
在继承的关系中,“子类就是一个父类”。也就是说,子类可以被当作父类看待。
- 关系:is-a。
- 例如:父类是员工,子类是讲师,那么“讲师就是一个员工”。
-
继承当中子类可以拥有父类的“内容”, 子类还可以拥有自己专有的内容。
-
子类只能从被扩展的父类获得成员变量、方法和内部类(包括内部接口、枚举),不能获得构造器和初始化块。
3、语法格式
定义父类的格式和定义一个普通的类没有区别
- 定义子类的格式:
public class 子类名称 extends 父类名称{
// ...
}
4、成员的访问特点
子类和父类中成员变量重名的访问特点
在父子类的继承关系中,如果成员变量重名,则创建子类对象时,访问的规则是:
等号左边是谁,就优先用谁,没有则向上找。
子类和父类中成员方法重名的访问特点(对于非静态方法)
创建的对象是谁,就优先用谁,没有则向上找。
该方法属于谁时,先看子类中有没有,没有则向上找,不能去其他子类中找。
子类是否可以继承父类的私有成员变量?
- 可以的,只是不能直接访问,可以在父类中设置相应的方法,在子类中进行访问。
子类是否可以继承父类的静态成员?
- 有争议的知识点。
- 子类可以直接使用父类的静态成员(共享)。
- 但个人认为:子类不能继承父类的静态成员。(共享并非继承)。
对静态和非静态方法的测试:
// 父类
public class Fu {
public static void print() {
System.out.println("Fu==>print()");
}
public void show() {
System.out.pr