今天我们对抽象类和接口的概念有了初步了解。
1.抽象类:在某些情况下,父类中只知道子类中应该包含什么样的方法,但是无法知道其具体的实现内容。
可以通俗理解为,父类定义了一个方向,让子类定义方法去解决。
2.抽象方法和抽象类都是使用 abstract 修饰的。
如果在一个类中定义了抽象方法,那么这个类就是抽象类;
抽象类是无法实例化的,只能作为父类被继承使用;
抽象类的构造器只能用于被实现的子类的构造器调用。
tips:
abstract 是不能修饰成员变量的;
如果方法定义为 static,就不能使用 abstract 修饰符;
如果方法定义为 private ,也不能使用 abstract 修饰符;3.抽象类的作用:
抽象类体现的是一种模板模式的设计思想,抽象类作为多个子类的通用模板,子类在抽象的基础上进行扩充,但是子类整体上会保留抽象类的行为方法(必须要实现抽象类的抽象方法);
抽象类一般只是定义需要使用的方法,把不能实现的部分抽象成抽象方法,留给子类去实现;
父类中可以有实现的方法,但是子类也是可以对已经实现的方法进行改造的(即重写:override),但是如果在子类中还需要调用父类的实现方法,可以使用 super 关键字(上周学习过的super关键字类似this)。
4.接口本质上是一种最彻底的抽象类。如果在一个类中,一个实现的方法都没有,或者都是抽象方法,那么,这样的类,成为接口。接口定义使用 interface 定义。
语法:
[修饰符] interface 接口名 extends 父接口1, 父接口2... {
0-N 个常量;
0-N个抽象方法;
}
接口中所有的成员在定义的时候访问控制修饰符只能是 public 或者是 default;
接口的命名规范同类的命名规范;
在接口中,成员变量必须是静态的常量,方法必须是抽象方法,所以可以省略相关的修饰符。
5.接口的继承和类的继承不一样,接口支持多继承,同样也使用 extends 关键字,之间用逗号隔开,继承的内容包含了,常量和方法。
语法:
Inter3.java
public interface Inter3 extends Inter1, Inter2{
static String C3 = "c3"; // 常量定义的命名规范是全部大写,两个单词之间用 _
void Inter3fun1();
void Inter3fun2();
}
6.
接口的使用
接口是抽象类一样,是不能被实例化的,但是接口可以用于声明引用类型的变量,当使用接口来声明变量时,该变量的运行时类型必须是该接口的实现类。
接口的作用:
用于定义实现类的行为规范;
定义变量;
定义一些常量;
被其他类实现。
一个类是可以实现多个接口的,使用 implements 关键字,多个接口之间用逗号隔开。、
语法:
[修饰符:public、final] class 类名 extends 父类 implements 接口1,接口2...{
....
}
注意:此处的extends只能继承一个父类,和接口不同!
7.
接口和抽象类
相同点:
都不能被实例化,位于继承树的顶端,是用于被其他类继承或者实现的;
都可以包含抽象方法,子类都必须要实现抽象方法;
在实际的开发中,都是接口先行,一般都是先定义接口,然后开发人员实现接口,完成具体方法的实现;
抽象类是个半成品,可以作为一个模板去使用。
不同点:
抽象类中可以定义普通方法,但是接口中都是抽象方法和静态变量;
在抽象类是可以定义静态方法的,接口中不能定义静态方法的;
在抽象中可以定义构造器的,但是在接口中是不存在构造器这个概念的;
一个类最多只能有一个直接的父类或者抽象类,但是可以有多个接口的实现。