继承☆ (1)多个类中存在相同的属性和行为时,将这些内容抽取到单独的一个类中,那么多个类无需在定义这些属性和行为,只要继承那个类即可。 (2)用关键字extends表示,格式如下: class子类名 extends 父类名 {} 单独的这个类叫父类,基类或者超类;这多个类可以称为子类或者派生类 (3)继承的好处: A:提高了代码的复用性 B:提高了代码的维护性 C:让类与类产生了一个关系,是多态的前提(其实这也是弊端,类的耦合性很强) (4)继承的弊端: A:让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类。 开发的原则:低耦合,高内聚。 耦合:类与类的关系 内聚:自己完成某件事情的能力 B:打破了封装性 (5)Java中继承的特点 A:Java中类只支持单继承,不支持多继承 有些语言是支持多继承的,格式:extends 类1,类2.... B:Java中可以多层继承(儿子--父亲--爷爷) (6)继承的注意事项: A:子类只能继承父类的非私有成员(方法和变量) B:子类不能继承父类的构造方法,但是可以通过super去访问 C:不要为了部分功能而去继承 (7)什么时候使用继承呢? A:继承体现的是:is a的关系。 person student teacher 水果 香蕉 苹果 B:采用假设法 如果有两个类A、B,只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承 Java继承中的成员关系 A:成员变量 当子类的成员变量名称和父类中的成员变量名称一样时,类的方法访问变量的查找顺序如下: 在子类方法的局部范围找,有就使用。 在子类的成员范围找,有就使用。 在父类的成员范围找,有就使用。 找不到,就报错。 B:构造方法 子类中所有的构造方法默认会去访问父类的无参构造方法 为什么呢? 因为子类会继承父类中的数据,可能还会使用父类的数据,所以,子类在 初始化之前,一定要先完成父类数据的初始化。 注意: 子类的每一个构造方法的第一条语句默认都是:super() super()代表访问父类的无参构造方法 父类中如果没有无参构造方法会出现什么现象呢?如何解决呢? 报错。 如何解决呢? (1)在父类中加一个无参构造方法 (2)子类通过super去明确访问父类的带参构造方法 (3)子类通过this调用本身的其他构造 注意: this(...)和super(...)一定要出现第一句语句上,如果不是放在第一句,就可能对父类的数据进行了多次初始化,所以必须放在第一句 子类中一定要有一个去访问父类的构造,不管是有参的还是无参的构造,这样就能完成父类数据的初始化 C:成员方法 当子类的成员方法名称和父类中的成员方法名称一样时,类访问方法的查找顺序: 在子类中找,有就使用。 在父类中找,有就使用。 找不到,就报错。 初始化 A:一个类的初始化过程 成员变量初始化 默认初始化 显示初始化 构造方法初始化 B:子父类的初始化过程(分层初始化) 先进行父类初始化,再进行子类初始化 super()仅仅代表先初始化父类,而不存在什么方法内外的问题,等父类初始化完了之后,在从头到尾去初始化子类
|