继承Inheritance


继承Inheritance

将多个具有共同特点的对象抽象出一个”父类”.

父类中存储的是各个子类共同的特点[属性]或者功能[方法]

继承的好处 - 提高了代码的复用性.使用多态的前提,为了代码的可拓展性.

继承的缺点 - 增加了类与类之间的关系.不太符合软件的设计原则”高内聚,低耦合”

​ 低耦合 - 模块与模块之间/类与类之间的关系应该越弱越好 - 没有关系

​ 高内聚 - 单个模块/类能够独立完成某个业务功能的能力比较强.

​ 实际开发中,可以采用设计原则**”合成复用原则”** - 来替代继承的使用.

使用extends关键字来表示某个类继承某个父类

比如:

public class A{

}
public class B extends A{

}
B 是 A的子类,A是B的父类,基类,超类.
1. A的父类就是java.lang.Object - 当某个类如果没有明确指定它的父类是谁,那么这个类默认继承Object
2. 子类是可以访问到父类中所有的非私有的成员
3. java的类只支持单继承.一个类只能继承一个父类.避免出现网状结构,保证类的层次性.
   java中的接口是支持多重继承.一个接口可以继承多个接口.
4. 继承具有传播性.C extends B    B extends A
   C间接继承于A,C也是可以访问到A中的所有的非私有的成员
5. 不要滥用继承,前提B is A

super关键字

必须放在构造方法的首行

  1. 调用父类的构造

    在子类的构造中,如果没有出现任何的super语句.那么系统默认会给定super(); - 调用父类的空参构造

  2. 当在子类中调用了一个和父类中同名的成员的时候,需要通过super关键字来加以区分[强制调用父类中那个同名的成员]

多态 - polymorphism

对象有多种形态.发生前提是具有继承关系

相同的消息可能会送给多个不同的类别之对象

而系统可依据对象所属类别,引发对应类别的方法,而有不同的行为。简单来说,所谓多态意指相同的消息给予不同的对象会引发不同的动作。

instanceof

进行类型的判断,只有为true的时候,才能够进行类型的转换[强制,向下]

如果没有进行类型的判断,随便进行了一个强制类型转换,可能会抛出java.lang.ClassCastException类型转换失败异常

三种场景应用

面向父类编程

  1. 对象的编译时类型写成父类,对象的运行时类型写成子类

    编译时类型 对象名 = new 运行时类型();

    对象的编译时类型决定了对象的访问能力 - “对象名只能访问到编译时类型中定义的成员”

    对象的运行时类型决定了对象的行为能力 - “子类中如果一旦重写了父类中的方法,那么运行期间调用的是子类重写之后的方法”

  2. 方法的参数类型写成父类,调用这个方法的时候,可以传入这个父类的任意一个子类对象

  3. 方法的返回类型写成父类,方法的返回结果可以是这个父类的任意一个子类对象 - “简单工厂设计模式”

final关键字

不可更改,不可变

  1. final修饰的变量/属性 - 不能够重新赋值
  2. final修饰的类 - 不能够被继承
  3. final修饰的方法不能够被重写.

修饰符

访问修饰符 - 决定了这个成员可以在哪里能够被访问.

所有包 子类[可以不同,同包] 同包 本类
public 公共的,公开的
protected 受保护的 ×
默认的 × ×
private 私有的 × × ×

安全级别:private>默认的>protected>public

可见区域:public>protected>默认的>private

方法的重写

方法的重载和方法的重写有什么区别?

特点:

发生的前提是要有继承关系

  1. 重写有个特殊的场景 - 子类重写之后的方法的修饰符,返回类型,方法名,参数列表和父类中高度保持一致 - 重构
  2. 子类重写的方法的访问修饰符可以小于或者等于父类
  3. 方法名必须要一样.
  4. 子类重写的方法的返回类型可以小于[可以是父类方法的返回类型的子类类型]或者等于父类的那个方法
  5. 参数列表必须要高度保持一致

文章作者: 码农耕地人
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 码农耕地人 !
  目录