本文已参与「新人创作礼」活动,一 起开启掘金创作之路
特点:
- 继承是发生在多个类之间
- 继承使用关键字extends
- java只允许单继承,不允许多继承
- 被继承的类叫父类(超类),继承父类的类叫做子类(派生类)
- 在父类中的非私有属性和放大可以被子类继承
- protected(受保护的访问权限修饰符),修饰的属性或方法可以被子类继承
- 构造方法不能被继承
- 创建对象会调用构造方法,调用构造方法不一定就是创建对象
- 实例化子类对象,会先调用父类的构造方法,如果父类中没有默认的构造方法,那么子类必须显示的通过super(...)来调用父类的带参构造方法,super也只能在子类构造方法的第一句
继承的好处
- 提高代码的复用性
- 提法代码的维护性
- 让类与类值间产生关系,是多态的前提
继承的缺点
- 增强了类与类之间的耦合性
开发原则: 高内聚,低耦合
方法重写
在java中,子类可以继承父类中的方法,而不需要重新编写相同的方法。
但有时子类不想原封不动的继承父类的方法,而想做一定的修改,这就需要采用方法的重写,又称方法覆盖。
在子类和父类中,重写方法后,在调用时,以创建的对象类型为准,会调用谁的方法。
关于方法重写的一些特性:
- 发生在子父类中,方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类方法)
- 子类抛出的异常不能超过父类相应方法抛出的异常(子类异常不能大于父类异常)
- 子类方法的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类的访问级别)
- 父类中的方法若使用private、static、final任意修饰符修饰,那么,不能被子类重写
为什么要重写方法?或者方法重写的目的是什么?
若子类从父类中继承过来的方法,不能满足子类特有的需求时,子类就需要重写父类中相应的放法,方法的重写也是程序扩展的体现。
super关键字
super可以完成以下操作
- 使用super调用父类中的属性,可以从父类实例处获取信息
- 使用super调用父类中的方法,可以委托父类对象帮助完成某件事情
- 使用super调用父类中的构造方法(super(实参)形式),必须在子类构造方法的第一条语句,调用父类中相应的构造方法,若不显示的写出来,默认调用父类的无参构造方法,比如:super();
抽象类
什么是抽象类?
用abstract关键字生命的类成为抽象类
很多具有相同特征和行为的对象可以抽为一个类
很多居右相同特征和行为的类可以抽为一个抽象类
特点:
- 抽象类可以没有抽象方法,有抽象方法的类必须是抽象类
- 非抽象类继承抽象类必须实现所有的抽象方法
- 抽象类可以继承抽象类,可以不实现父抽象类方法
- 抽象类可以有方法实现和属性
- 抽象类不能被实例化
- 抽象类不能生命为final
- 抽象类可以有构造方法
接口
接口的使用规则:
- 定义一个接口,使用interface关键字
- 在一个接口中,只能定义常量、抽象方法、JDK1.8后可以定义默认的实现方法
- 接口可以继承多个接口,extends xxx,xxx
- 一个具体的类实现接口使用implements关键字
- 一个类可以实现多个接口
- 抽象类实现接口可以不实现接口的方法
- 在接口中定义的方法没有申明访问修饰符,默认为public
- 接口不能有构造方法
- 接口不能被实例化
接口的面向对象设计原则
- 对修改关闭,对扩展开放
- 面向接口编程
多态
多态是面向对象三大特征之一
什么是多态?
对象在运行过过程中的多种形态 多态性可以大概分为两类
- 方法的重载与重写
- 对象的多态性
对象的多态性
对象多态性是从继承关系中的多个类而来
向上转型:将子类实例转为父类实例
格式:父类 父类对象=子类实例; --> 自动转换
以基本数据类型操作为例:int i='a';
(因为char的容量比int小,所以可以自动完成)
向下转型:将父类实例转为子类实例
格式:子类 子类对象 = (子类)父类实例; 强制转换
以基本数据类型操作为例: char c=(char)97;
因为整型是4个字节比char2个字节要大,所以需强制完成
多态性小结
- 方法的重载与重写就是方法的多态性表现
- 多个子类就是父类中的多种形态
- 父类引用可以指向子类对象,自动转换
- 子类对象指向父类引用需强制转换(注意:类型不对会报异常)
- 在实际开发中尽量使用父类引用(更利于扩展)
结论
在变成时针对抽象类型的编写代码,称之为面向对象编程(或面向接口编程) 父类通常都定义为抽象类、接口