目录
一、抽象类
(一)抽象方法(关键字 abstract)
一个抽象方法只有方法头,没有方法主体(连大括号{}也不要有),以分号结尾
定义格式如下:
访问修饰符 abstract 返回类型 方法名(参数列表);
例如:public abstract void method (String s);
其中抽象方法的访问修饰符只能是public或protected(因为如果是private,子类就没办法实现该抽象方法)
抽象方法要求在派生类中被重写
(二)抽象类(关键字 abstract)
含有抽象方法的类自动成为抽象类,必须以abstract关键字声明
定义格式如下:
public abstract class 类名 {
抽象方法头;
}
抽象类定义时不要求定义属性,对属性的要求和普通类是一样的,但必须含有抽象方法
抽象类的派生类(extends)就是普通的类或者仍是抽象类
需要注意的是:
(1)派生类使用抽象方法(说明实例化了派生类,那派生类就一定不能是抽象类)前必须实现(重写)抽象方法,否则会报错;
(2)抽象类可以含多个抽象方法,也可以含多个或者不含普通方法;
(3)抽象类不能实例化,即不能创建对象,只能作为基类提供抽象方法;
(4)如果子类没有将抽象类中所有的抽象方法都实现,那么子类仍然是抽象类,定义时仍然要加关键字abstract;如果子类实现了抽象类中所有抽象方法,那子类不再是抽象类也就可以实例化了;总之,只要抽象类的派生类还含有(继承来的)抽象方法,就还是抽象类
(5)抽象类的派生类只能由抽象类单继承而来,不存在多继承,继承的关键字:extends
二、接口
(一)接口的定义(关键字:interface)
接口定义格式:
public interface 接口名 {
抽象方法头;
}
接口可以含有属性,接口的属性被隐式指定为 public static final类型(且必须是这样),所以定义属性时只需要写属性的数据类型
其中接口的抽象方法的定义格式和抽象类中抽象方法的定义格式差不多(注意要写关键字abstract),接口的抽象方法必须是public的
接口中只能含抽象方法,不能有普通方法
接口也不能实例化
接口的抽象方法定义格式如下:
public abstract 返回类型 方法名(参数列表);
(二)实现类的定义(关键字:implements)
定义格式:
public class 类名 implements 接口名1,接口名2,... {
}
实现类可以有多个接口
接口和实现类之间存在类似契约关系,实现类要实现接口中所有的抽象方法
(三)接口的继承(extends)
与类的继承类似,接口之间也存在继承关系,而且接口存在多继承,父接口的顺序可任意
接口只能继承于接口,而不能继承于类
定义格式如下:
public 接口名 extends 父接口名1,父接口名2... {
}
三、抽象类和接口的区别
(一)定义的关键字不同
抽象类定义的关键字是abstract,
接口定义的关键字是interface
(二)对属性的要求不同
抽象类可以有属性,对属性没有什么要求,与普通类的属性没有差别;
接口可以有属性,隐式定义了属性为public static final类型,不可更改,定义时只需要写明属性的数据类型。
(三)是否可含普通方法
抽象类可以含有普通方法,其中抽象方法不能是private的;
接口只能含抽象方法,且所有方法必须为public的。
(四)两者的派生类
都需要关键字extends表示继承关系,
抽象类和普通类一样,只能单继承;
接口可以多继承,各父接口间用逗号分隔。
(五)构造方法
抽象类可以有构造方法,
接口不可以有构造方法。
(六)实现
类或抽象类继承抽象类后,对父类中的抽象方法进行重写,也就是抽象类的实现,一个子类只能实现一个父抽象类;
用类实现接口,关键字implements,在实现类中需要实现接口中的所有抽象方法,一个类能实现多个父接口,各父接口间用逗号分隔。
结语:
抽象类和接口两者都有利有弊,都有他们适合应用的场景,没有绝对的哪个更好。比如想要有一些默认的方法或者添加新方法就用抽象类,如果想实现多继承就用接口,活学活用。望学习进步!