文章目录
抽象类
抽象方法的语法
权限修饰符 abstract 方法返回值类型 方法名(形参列表);
说明:
- 抽象方法没有方法体,不用实现
- 抽象方法必须要在抽象类中
抽象类的语法
权限修饰符 abstract 类名{ 类体}
说明:
- 权限修饰符:
public
或者默认 - 抽象类的类名:一定要大驼峰,一般习惯命名位
AbstractXxxx
或者BaseXxxx
- 抽象类不可以创建对象
抽象类的特点
- 类名命名特点是什么?
大驼峰,Base或者Abstract开头
- 能用哪些修饰符?
public 或者 默认
- 成员特点
- 普通成员
OK
- 静态成员
OK
- 抽象方法
OK
- 普通成员
- 构造器
OK
- 代码块
OK
结论:一个抽象类,普通类有的抽象类都有,抽象类就是在普通类的基础上多了一个抽象方法
抽象类的使用
- 普通类继承抽象类
如果子类是一个普通类,要实现抽象父类中的所有抽象方法 - 如果子类是一个抽象类,可以选择性的实现抽象父类中的抽象方法
- 抽象类还可以继承普通类
- 上层的类越来越抽象,下层的类越来越具体
注意事项
-
abstract关键字,不能用来修饰构造器、属性、代码块等结构。只能修饰类或者方法。
-
abstract修饰类时,类的修饰符不能有final。
-
abstract修饰方法时,该方法不能有修饰符:
- private
- static
- final
-
一个抽象类中可以没有抽象方法,但是没有意义
接口
接口的定义
权限修饰符 interface 接口名{}
说明:
- 权限修饰符跟
class
一样 inerface
关键字表示接口,跟class
具有同等的地位,也是引用数据类型- 接口名要求大驼峰
- 接口中可以放抽象方法,跟抽象类一样
- 一个类可以继承接口,不用
extends
,用implements
(实现)来表示,通常继承某个类,实现某个接口 - 一个类实现了某个接口,这个类就是接口的子类,接口是这个类的父接口
- 一个类同时可以满足既继承了某个父类,又实现了某个接口,并且这个类可以实现多个接口
语法:权限修饰符 class 类名 extends 父类 implements 接口
----> 注意顺序不要错了
并且这个类可以实现多个接口
语法:权限修饰符 class 类名 (extends 父类) implements 接口1, 接口2 ...
- 接口是可以继承的,并且是多继承
接口的特点
- 接口的声明特点
- 接口能不能创建对象?
NO
- 接口能不能用final修饰?
NO
- 接口能不能创建对象?
- 接口的实现类的书写格式
- 命名:
- 接口的命名 习惯以
IXxx
大驼峰 - 接口实现类的命名:习惯以
xxxImpl
- 接口的命名 习惯以
- 定义了一个接口,某个类实现这个接口的时候有一些要求:
- 在定义接口的位置,新建一个包
impl
,里面写接口的实现类,或者在接口的位置,直接写实现类 - 接口中大部分都是抽象方法
- 在定义接口的位置,新建一个包
- 成员特点
- 能否定义属性(成员变量, 静态成员变量, 全局常量)?
默认是public static final -----> 都是全局变量
,隐藏的单词不用写出来 - 能否定义方法/行为?
普通方法默认都是public abstract
抽象方法,隐藏的单词不用写出来
可以有静态方法,但是一般不用
- 能否定义属性(成员变量, 静态成员变量, 全局常量)?
- 构造器
NO
- 代码块
NO
总结:
接口的特点:
接口里可以定义全局常量、静态方法、抽象方法
- 大多数情况下,接口里面只放抽象方法,比如
Closeable
、Runnable
、Callable
- 特殊情况下,接口里面不放任何东西,比如
Cloneable
、Serializable
,表示是一个空接口,起到标记的作用 - 实现接口的类,如果没有明确继承一个其他类,那么子类对象的隐式初始化
super()
指向Object
类。 - 接口虽然不是类,但是它也继承了
Object
类。
接口的使用
- 子类是普通类,要求实现接口中的所有的抽象方法
- 子类是抽象类,子类可以自由实现
- 接口可以继承一个接口,并且接口在继承接口后,可以重写父接口中的抽象方法和默认方法
extends VS
implements
- 继承(extends)是不能跨越种族的,类和类继承,接口和接口继承,接口和类之间没有继承关系。
- 普通类继承一个抽象类,需要实现里面的所有抽象方法。
- 抽象类继承一个抽象类,按需实现里面的抽象方法。
- 抽象类继承一个普通类,是可以的。
- 接口在继承一个接口后,会得到接口的所有抽象方法。
- 类的继承是单继承的,接口的继承是多继承的。
- 实现(implements),必须发现在类与接口之间,接口和类是没有任何关系的。
- 普通类实现接口,必须实现所有抽象方法
- 抽象类实现接口,按需实现抽象方法
默认方法和静态方法
接口中可以有:
默认方法:默认public
语法:
default 返回值类型 方法名(形参列表){
// 方法体
}
静态方法:默认public
语法:
static 返回值类型 方法名(形参列表){
// 方法体
}
调用方式:接口名.静态方法名
接口VS
抽象类
方法传参
- 形参如果写一个普通类:调用方法时需要传入的是该类的对象或者该类的子类对象
- 形参如果写一个抽象类:调用方法时需要传入的是该抽象类的子类对象
- 形参如果写一个接口:调用方法时需要传入的是该接口的子类对象
方法的返回值
- 返回值类型如果写一个普通类:可以返回该类的对象或者该类的子类对象
- 返回值类型如果写一个抽象类:返回该抽象类的子类对象。
- 返回值类型如果写一个接口:返回该接口的子类对象。
方法重写中的返回值类型问题
引用类型:不必保持一模一样,存在自动向上转型。
- 类:父类中的方法返回一个普通类类型
- 子类方法中可以返回该类型
- 也可以返回该类的子类类型
- 抽象类:父类中的方法返回一个抽象类类型
- 子类方法可以返回该类型
- 也可以返回抽象类的实现类类型
- 接口:父类中的方法返回一个接口类型
- 子类方法可以返回该类型
- 也可以返回接口的实现类类型
链式调用
eg:
new StudentDemo().getStudent().show();