抽象类和接口
抽象类
什么是抽象类
要解释抽象类,首先解释一下什么是抽象方法
抽象方法:方法必须使用关键字abstract修饰,有声明,没有方法体(注意在编码的时候,不能丢掉“;”。{}的含义是方法体为空,没有方法体就代表没有{}结构)
那么现在解释一下什么是抽象类
抽象类:
从外形上看,必须使用abstract关键字修饰
从其内容来看,如果一个类中,包含了抽象方法,那么这个类一定为抽象类。但是,在抽象类中,也可以包含具体的类,也就是说,在一个抽象类内部,可能连一个抽象函数都没有,全部都是具体的方法。
抽象类的使用原则如下
(1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public;
(2)抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理;
(3)抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类;
(4)子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。);
(5)抽象类里会存在一些属性,那么抽象类中一定存在构造方法,其存在目的是为了属性的初始化。
并且子类对象实例化的时候,依然满足先执行父类构造,再执行子类构造的顺序。
(6)抽象类不可以用final声明, 因为抽象类必须有子类,而final定义的类不能有子类;
(7)可以直接调用抽象类中用static声明的方法, 因为任何时候,如果要执行类中的static方法的时候,都可以在没有对象的情况下直接调用,对于抽象类也一样。
抽象类的作用:捕捉子类的通用特性
接口
什么是接口(Interface)
1.直观上看,由interface修饰的类,就是一个接口,其声明方式为
public interface A{……}
2.特征上来看,接口是一种特殊的抽象类,其中只包含抽象方法和全局常量,连构造方法也没有:
其成员变量,默认由public static final修饰的(可省略),且必须显式初始化,所以均为常量,最好使用大写方式表示(名称过长使用“_”分隔);
其成员方法,默认由public abstract修饰的(可省略),且不能有方法体,只是一种声明。
interface A{
int var;//错,必须显式初始化
int COUNT = 1;//合法,默认为public static final的
public static final int CON = 2;//合法,显式声明为public static final的
public abstract void testfun();//合法,显式声明为public abstract
void testfun01();//合法,默认为public abstract的
protected void testfun02();//错,接口中的方法的修饰符只能存在public、abstract、 default、 static
void testfun03() {};//错,接口中只能有抽象方法,不能有方法体
static void testfun04() {}//合法,由static修饰的方法,必须有方法体
}
接口是用来干什么的
接口是一种规范,接口定义了多个对象的共同行为,实现接口的对象可以分别实现自己的方法体。
如何使用接口:
1.接口是不能被实例化的,所以必须有子类来实现接口,关键字为implements,子类可以同时实现多个接口,间接地实现了多继承;
2.如果实现接口的子类不是抽象类,那么子类中必须重写接口中所有的抽象方法;
3.虽然,接口不能使用new的方式进行实例化,但是可以定义接口类型的引用变量,并且使用子类对象的向上类型转换进行实例化。
public class interface01 implements A,B{
//子类重写了接口的所有抽象方法
@Override
public void testfun() {
System.out.println("接口A");
}
@Override
public void testfun01() {
System.out.println("接口B");
}
public static void main(String[] args) {
interface01 i1 = new interface01();
//定义接口类型的引用
A a = i1;
B b = i1;
a.testfun();
b.testfun01();
}
}
interface A{
public abstract void testfun();//合法,显式声明为public abstract
}
interface B{
void testfun01();
}
4.一个接口不能实现其他接口,但是可以继承其他多个接口
interface C extends A,B{
}
5.instanceof
接口使用instanceof关键字,判断一个对象是否实现了某接口。
6.接口的好处
(1)接口反映了对象以及对对象操作的本质。
(2)代码复用,同一套代码可以处理多种不同类型的对象,只要这些对象都有相同的能力。
(3)降低了耦合,提高了灵活性。使用接口的代码依赖的是接口本身,而非实现接口的具体类型,程序可以根据情况替换接口的实现,而不影响接口使用者。
抽象类VS接口
1.接口只能包含抽象方法,抽象类可以包含普通方法。
2 接口只能定义静态常量属性,并且显式初始化;抽象类既可以定义普通属性,也可以定义静态常量属性。
3 接口不包含构造方法,抽象类里可以包含构造方法。
抽象类不能被实例化,但不代表它不可以有构造函数,抽象类可以有构造函数,备继承类扩充
4 抽象类是一个特殊的类,但是接口与类是不同的类型
5 接口是核心,其定义了要做的事情,包含了许多的方法,但没有定义这些方法应该如何做。
如果许多类实现了某个接口,那么每个都要用代码实现那些方法
如果某一些类的实现有共通之处,则可以抽象出来一个抽象类,让抽象类实现接口的公用的代码,而那些个性化的方法则由各个子类去实现。
抽象类是为了简化接口的实现,他不仅提供了公共方法的实现,让你可以快速开发,又允许你的类完全可以自己实现所有的方法,不会出现紧耦合的问题。
应用场合很简单了
1 优先定义接口
2 如果有多个接口实现有公用的部分,则使用抽象类,然后集成它。
参考资料