java继承

209 阅读5分钟

本文已参与「新人创作礼」活动,一 起开启掘金创作之路

特点:

  • 继承是发生在多个类之间
  • 继承使用关键字extends
  • java只允许单继承,不允许多继承
  • 被继承的类叫父类(超类),继承父类的类叫做子类(派生类)
  • 在父类中的非私有属性和放大可以被子类继承
  • protected(受保护的访问权限修饰符),修饰的属性或方法可以被子类继承
  • 构造方法不能被继承
  • 创建对象会调用构造方法,调用构造方法不一定就是创建对象
  • 实例化子类对象,会先调用父类的构造方法,如果父类中没有默认的构造方法,那么子类必须显示的通过super(...)来调用父类的带参构造方法,super也只能在子类构造方法的第一句

继承的好处

  1. 提高代码的复用性
  2. 提法代码的维护性
  3. 让类与类值间产生关系,是多态的前提

继承的缺点

  • 增强了类与类之间的耦合性

开发原则: 高内聚,低耦合

方法重写

在java中,子类可以继承父类中的方法,而不需要重新编写相同的方法。
但有时子类不想原封不动的继承父类的方法,而想做一定的修改,这就需要采用方法的重写,又称方法覆盖。
在子类和父类中,重写方法后,在调用时,以创建的对象类型为准,会调用谁的方法。

关于方法重写的一些特性:

  1. 发生在子父类中,方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类方法)
  2. 子类抛出的异常不能超过父类相应方法抛出的异常(子类异常不能大于父类异常)
  3. 子类方法的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类的访问级别)
  4. 父类中的方法若使用private、static、final任意修饰符修饰,那么,不能被子类重写

为什么要重写方法?或者方法重写的目的是什么?

若子类从父类中继承过来的方法,不能满足子类特有的需求时,子类就需要重写父类中相应的放法,方法的重写也是程序扩展的体现。

super关键字

super可以完成以下操作

  1. 使用super调用父类中的属性,可以从父类实例处获取信息
  2. 使用super调用父类中的方法,可以委托父类对象帮助完成某件事情
  3. 使用super调用父类中的构造方法(super(实参)形式),必须在子类构造方法的第一条语句,调用父类中相应的构造方法,若不显示的写出来,默认调用父类的无参构造方法,比如:super();

抽象类

什么是抽象类?

abstract关键字生命的类成为抽象类
很多具有相同特征和行为的对象可以抽为一个类
很多居右相同特征和行为的类可以抽为一个抽象类

特点:

  1. 抽象类可以没有抽象方法,有抽象方法的类必须是抽象类
  2. 非抽象类继承抽象类必须实现所有的抽象方法
  3. 抽象类可以继承抽象类,可以不实现父抽象类方法
  4. 抽象类可以有方法实现和属性
  5. 抽象类不能被实例化
  6. 抽象类不能生命为final
  7. 抽象类可以有构造方法

接口

接口的使用规则:

  1. 定义一个接口,使用interface关键字
  2. 在一个接口中,只能定义常量、抽象方法、JDK1.8后可以定义默认的实现方法
  3. 接口可以继承多个接口,extends xxx,xxx
  4. 一个具体的类实现接口使用implements关键字
  5. 一个类可以实现多个接口
  6. 抽象类实现接口可以不实现接口的方法
  7. 在接口中定义的方法没有申明访问修饰符,默认为public
  8. 接口不能有构造方法
  9. 接口不能被实例化

接口的面向对象设计原则

  1. 对修改关闭,对扩展开放
  2. 面向接口编程

多态

多态是面向对象三大特征之一

什么是多态?

对象在运行过过程中的多种形态 多态性可以大概分为两类

  • 方法的重载与重写
  • 对象的多态性

对象的多态性

对象多态性是从继承关系中的多个类而来

向上转型:将子类实例转为父类实例

格式:父类 父类对象=子类实例; --> 自动转换

以基本数据类型操作为例:int i='a';

(因为char的容量比int小,所以可以自动完成)

向下转型:将父类实例转为子类实例

格式:子类 子类对象 = (子类)父类实例; 强制转换

以基本数据类型操作为例: char c=(char)97;

因为整型是4个字节比char2个字节要大,所以需强制完成

多态性小结

  1. 方法的重载与重写就是方法的多态性表现
  2. 多个子类就是父类中的多种形态
  3. 父类引用可以指向子类对象,自动转换
  4. 子类对象指向父类引用需强制转换(注意:类型不对会报异常)
  5. 在实际开发中尽量使用父类引用(更利于扩展)

结论

在变成时针对抽象类型的编写代码,称之为面向对象编程(或面向接口编程) 父类通常都定义为抽象类、接口