抽象类和接口
一、抽象类
在java中,当一个类的方法被abstract关键字修饰时,该方法称为抽象方法。抽象方法所在的类必须定义为抽象类。
当一个方法被定义为抽象方法后,意味着该方法不会有具体的实现,而是在抽象类的子类中通过方法重写进行实现。
定义抽象方法的语法格式:
[访问修饰符]abstract<返回类型><方法名>([参数列表]);
抽象类没有具体的实例,不能被实例化。但是可以创建一个引用变量,其类型是一个抽象类,指向非抽象的子类实例。抽象类不能是最终类。因为抽象类是用来被继承的,而最终类是无法被继承的,互相就矛盾了。
①抽象类的作用:
1.抽象类定义了一种父类型,用来被继承。而子类可抽象可不抽象,不抽象的子类可以new实例化。
2.抽象类中的抽象方法没有无需写方法体,而通过子类来实现这个方法,能够减少一些代码量。
②抽象方法:
类中有些方法没有实现代码,也不能有实现代码,这样的方法可以定义为抽象方法。Java中抽象方法用abstract修饰方法名。
语法:
abstract 返回值类型 方法名(参数列表);
抽象方法需要注意以下几点:
1.抽象方法没有方法体(没有{})
2.抽象方法必须在抽象类里
3.抽象方法必须在子类中被实现,除非子类是抽象类
③抽象类和抽象方法之间的关系:
1.一个类中只要有一个抽象方法,这个类就必须是抽象类
2.一个抽象类里不一定要有抽象方法
3.抽象方法必须被非抽象的子类实现(通过重写),否则子类依然必须是抽象类
4.没有抽象的构造方法,也没有抽象静态方法
5.抽象类中可以有非抽象的构造方法,创建子类的实例时可以调用。
二、接口
java中接口的作用和生活中的接口类似,它提供一种约定,使得实现接口的类(或结构)在形式上保持一致。
接口是一个不能实例化的类型,接口类型的定义类似于类的定义。
1.语法格式:
public interface 接口名{
接口成员
}
和抽象类不同,定义接口使用interface 修饰符,访问修饰符只能是public ,前面不写访问修饰符也是默认是public 和abstract的。
2.定义接口需要注意的是:
①接口中只能包含抽象方法和静态常量,不能有属性变量
②接口中所有成员都必须是public的,不写默认是public
③接口中静态常量不写static和final也默认是static和final
④接口中抽象方法不写abstract和public也默认有abstract和public,不能有方法体(包括大括号)
3.接口具有以下特性:
①接口不可以被实例化
②实现类必须实现接口的所有方法,除非这个类也是抽象类
③实现类可以实现多个接口( implements),多个接口使用逗号隔开
④接口中的变量都是静态常量(public static final),必须显式初始化
⑤接口中所有方法都是抽象的
⑥接口中所有成员都必须是public 的
⑦接口可以被多重实现或继承,接口可以继承接口,但接口不能实现另一个接口,只能通过实现类去实现
⑧接口没有构造方法
三、抽象类与接口的对比
相同点:
1、代表系统的抽象层
2、都不能被实例化
3、都能包含抽象方法(用于描述系统提供的服务,不必提供具体实现)
不同点:
1、在抽象类中可以为部分方法提供默认实现,而接口中只能包含抽象方法(抽象类便于复用,接口便于代码维护)
2、一个类只能继承一个直接的父类,但可以实现多个接口
3、已存在的继承树,可以方便的抽取接口,但是抽取抽象类不容易
4、使用原则不同
①接口做系统与外界交互的窗口(接口提供服务)
②接口本身一旦制定,就不允许随意修改
③抽象类可完成部分功能实现,还有部分功能可作为系统的扩展点
四、面向对象设计原则
1、多用组合,少用继承
2、针对接口编程
3、针对扩展开放,针对改变关闭(改变原有代码容易对其他关联代码带来未知bug,通常采取扩展新功能,而不去修改原有代码