Lazy loaded image
编程
📕Day10-面向对象4(接口、抽象类、多态)
字数 4650阅读时长 12 分钟
2019-1-22
2025-8-13
type
status
date
slug
summary
tags
category
icon
password

抽象类的使用

如果父类里有一个方法,所有的子类都重写了这个方法,感觉父类里的方法就多余了,按说就不用定义这个方法了,但如果父类不定义方法的话,扩展性会降低。因此父类里应该定义这个方法,但不用写方法体 可以使用关键字 abstract 声明一个抽象方法和抽象类

抽象的特点

  1. 抽象方法不能有方法体,使用关键字abstract声明一个抽象方法
  1. 抽象方法所在的类必须是抽象类;抽象类里可以没有抽象方法。
  1. 抽象类不能直接创建实例对象,必须要定义一个子类,然后让子类实现抽象方法以后,创建子类对象。
  1. 如果一个类A继承了抽象类B,类A要重写(实现)父类B里所有的抽象方法。 如果类A没有实现父类里所有的抽象方法,类A也要被定义为抽象的
  1. 抽象类可以强制要求子类必须要执行哪些行为

final关键字

final关键字可以用来修饰类、变量以及方法
final修饰类: 被 final 修饰的类不能被继承。比如String System Math Objects
final修饰方法: 被final修饰的方法不能被子类重写!
final修饰变量: 被final修饰的变量称为常量,只能被赋值一次!!
final修饰引用数据类型,虽然不能指向新的空间,但是可以修改原空间里的值。 通常 final 很少用来修饰局部变量,大多情况下是用来修饰成员变量。 被 final修饰的成员变量命名时,使用全大写。

如何让一个类不能被继承

  1. 使用 final 禁止子类继承
  1. 构造方法私有化:子类在创建实例对象之前,会先调用父类的构造方法,初始化父类空间!

接口

使用关键字 interface 来声明一个接口,可以把接口看做是一个特殊类,类似于协议

接口中支持定义的成员

  1. 可以定义默认被 public static final 修饰的静态成员常量
  1. 接口里定义的方法,默认被 public abstract修饰,不能有方法体
  1. 在 JDK8以后,使用关键字 default 可以定义有方法体 的默认方法
  1. 在 JDK8以后,还可以定义静态方法!
  1. 在 JDK9以后,还可以使用 private关键字定义私有方法了

接口的特点

  1. 接口和抽象类一样,不能直接创建一个实例对象!要定义一个子类,然后创建子类对象
  1. 接口里不能定义构造方法
  1. 子类可以通过 关键字implements 来实现接口。
  1. 子类实现接口以后,就必须要实现接口里所有的抽象方法;
  1. 如果子类没有实现接口里所有的抽象方法,子类必须要声明为抽象类
  1. 一个类只能继承一个父类,但是可以实现多个接口。
  1. 接口和接口之间也可以继承,同时可以多继承!

接口实现方法的调用冲突问题

  1. 如果自己类里定义的有,第一优先级找本类
  1. 如果本类没有,但是父类和父接口里都有,优先找父类,以及父类的父类
  1. 如果本类和父类都没有,会调用父接口里的方法
  1. 如果父类里没有,但是多个父接口里有相同的方法,会报错!本类必须要重写这个方法! 子类在重写方法时,如果想要调用某个父接口里的方法,需要使用父接口名.super.方法名() 调用

接口和抽象类的异同

相同:
  1. 接口和抽象类里都能定义抽象方法,也都能定义具体方法(接口从JDK8以后可以定义默认方法)
  1. 接口和抽象类都不能使用 final 来修饰
不同:
  1. 抽象类里可以有构造方法,接口不能有构造方法
  1. 抽象类里可以定义成员变量和常量,接口只能定义静态成员常量
  1. 一个类A只能继承一个抽象类,但是可以实现多个接口
  1. 抽象类只能继承一个父类,但是接口之间允许多继承
 

接口实例

多态

当类和类之间有继承或者实现关系的时候,使用父类引用指向子类实例对象,叫做多态, 可以提高代码的灵活性

多态的特点

访问属性时,看等号左边变量的类型; 调用方法时,编译看等号左边变量声明的类型;运行时调用等号右边对象具体类型的方法
属性看左边; 方法编译看左边,运行看右边

多态的强制类型转化

“狗狗的多态”

多态练习题1

多态练习题2

多态练习题3

 
上一篇
Day09-面向对象3(继承)
下一篇
Day11-面向对象5(内部类、代码块、类和对象的初始化)