type
status
date
slug
summary
tags
category
icon
password
抽象类的使用
如果父类里有一个方法,所有的子类都重写了这个方法,感觉父类里的方法就多余了,按说就不用定义这个方法了,但如果父类不定义方法的话,扩展性会降低。因此父类里应该定义这个方法,但不用写方法体
可以使用关键字 abstract 声明一个抽象方法和抽象类
抽象的特点
- 抽象方法不能有方法体,使用关键字abstract声明一个抽象方法
- 抽象方法所在的类必须是抽象类;抽象类里可以没有抽象方法。
- 抽象类不能直接创建实例对象,必须要定义一个子类,然后让子类实现抽象方法以后,创建子类对象。
- 如果一个类A继承了抽象类B,类A要重写(实现)父类B里所有的抽象方法。 如果类A没有实现父类里所有的抽象方法,类A也要被定义为抽象的
- 抽象类可以强制要求子类必须要执行哪些行为
final关键字
final关键字可以用来修饰类、变量以及方法
final修饰类: 被 final 修饰的类不能被继承。比如String System Math Objects
final修饰方法: 被final修饰的方法不能被子类重写!
final修饰变量: 被final修饰的变量称为常量,只能被赋值一次!!
final修饰引用数据类型,虽然不能指向新的空间,但是可以修改原空间里的值。
通常 final 很少用来修饰局部变量,大多情况下是用来修饰成员变量。
被 final修饰的成员变量命名时,使用全大写。
如何让一个类不能被继承
- 使用 final 禁止子类继承
- 构造方法私有化:子类在创建实例对象之前,会先调用父类的构造方法,初始化父类空间!
接口
使用关键字 interface 来声明一个接口,可以把接口看做是一个特殊类,类似于协议
接口中支持定义的成员
- 可以定义默认被 public static final 修饰的静态成员常量
- 接口里定义的方法,默认被 public abstract修饰,不能有方法体
- 在 JDK8以后,使用关键字 default 可以定义有方法体 的默认方法
- 在 JDK8以后,还可以定义静态方法!
- 在 JDK9以后,还可以使用 private关键字定义私有方法了
接口的特点
- 接口和抽象类一样,不能直接创建一个实例对象!要定义一个子类,然后创建子类对象
- 接口里不能定义构造方法
- 子类可以通过 关键字implements 来实现接口。
- 子类实现接口以后,就必须要实现接口里所有的抽象方法;
- 如果子类没有实现接口里所有的抽象方法,子类必须要声明为抽象类
- 一个类只能继承一个父类,但是可以实现多个接口。
- 接口和接口之间也可以继承,同时可以多继承!
接口实现方法的调用冲突问题
- 如果自己类里定义的有,第一优先级找本类
- 如果本类没有,但是父类和父接口里都有,优先找父类,以及父类的父类
- 如果本类和父类都没有,会调用父接口里的方法
- 如果父类里没有,但是多个父接口里有相同的方法,会报错!本类必须要重写这个方法! 子类在重写方法时,如果想要调用某个父接口里的方法,需要使用父接口名.super.方法名() 调用
接口和抽象类的异同
相同:
- 接口和抽象类里都能定义抽象方法,也都能定义具体方法(接口从JDK8以后可以定义默认方法)
- 接口和抽象类都不能使用 final 来修饰
不同:
- 抽象类里可以有构造方法,接口不能有构造方法
- 抽象类里可以定义成员变量和常量,接口只能定义静态成员常量
- 一个类A只能继承一个抽象类,但是可以实现多个接口
- 抽象类只能继承一个父类,但是接口之间允许多继承
接口实例
多态
当类和类之间有继承或者实现关系的时候,使用父类引用指向子类实例对象,叫做多态, 可以提高代码的灵活性
多态的特点
访问属性时,看等号左边变量的类型;
调用方法时,编译看等号左边变量声明的类型;运行时调用等号右边对象具体类型的方法
属性看左边; 方法编译看左边,运行看右边
多态的强制类型转化
“狗狗的多态”
多态练习题1
多态练习题2
多态练习题3
- 作者:tacjin
- 链接:http://jin.wiki/article/857353c4-87b5-4149-b2af-475f5f9bd07b
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。