十二、面向对象-接口
1.抽象方法与抽象类
在某些情况下会希望定义这样一种父类,在该父类中定义了一些子类应该包含的方法,但是在父类中不能给出这些方法的有意义的实现,对于这类方法可以声明为抽象方法。
(1)抽象方法
概念:使用abstract修饰的方法(子类必须重写父类的抽象方法)
注意:
抽象方法没有方法实现,即没有方法体{},只有定义
类中如果有抽象方法,该类必须是抽象类,必须使用abstract
对于抽象方法,abstract不能与private、static同时使用:
如果将抽象方法声明为private,则子类中就无法重写该抽象方法
如果方法为static方法,则该方法属于类,而不属于某个对象,从而也就无法根据实际的指向的对象调用想用的方法
(2)抽象类
概念:使用abstract修饰的类
注意:
从语法上讲,抽象类中可以没有抽象方法,但是没有实际意义
有抽象方法的类必须是抽象类(有抽象方法的不一定是抽象类,接口当中全部都是抽象方法)
不能创建抽象类的对象,即不能new对象
抽象类可以当做一种引用类型来使用,声明变量
继承自抽象类的类,必需重写抽象类中的所有抽象方法,否则自身也使用abstract修饰,即也是抽象类
说明:抽象类只定义被其所有子类共享的一般形式,而让每个子类填充其细节。这种类确定了子类必需实现的方法
2.接口的概念和定义
接口中的方法全部都是抽象方法,不能存在实现的方法
使用interface修饰
3.接口中的属性和方法
(1)接口中所有方法默认是公有的抽象方法
隐式地标识为public、abstract,并且接口中的方法也只允许使用这两个修饰符
注意,在抽象类中必需使用abstract关键字明确指定方法为抽象方法
(2)在接口中所有变量默认为公有的静态常量
被隐式地标识为public、static、final,这意味着实现接口的类不能修改它们,同时还必须初始化它们
注意:接口不能new对象,但能作为一种类型定义引用变量
4.接口的实现
为了实现接口,在类定义中需要包含implements子句,然后创建接口定义的方法。
注意:
(1)实现接口的类,必须实现接口的所有抽象方法,如果只实现了部分抽象方法,该类必须声明为抽象类
(2)一个类可以实现多个接口,实现的多个接口用“,”隔开
(3)实现接口的类可以同时继承一个超类,必须是先继承后实现
说明:
接口定义了一组抽象方法,实现该接口的类需要实现这些抽象方法,从而实现接口的类就具备了接口所规定的行为(功能)
在Java中,接口可理解为对象间相互通信的协议,相当于模板
5.接口继承
接口可以通过关键字extends继承另一个接口,其语法和类继承相同,但是可以多继承。如果类实现的接口继承自另外一个接口,则该类必需实现在接口继承链中定义的所有方法。
6.抽象类与接口的区别
抽象类 | 接口 | ||
共同点 | 二者都可具有抽象方法,都不能实例化,但都可以有自己的声明,并能引用子类或实现类对象 | ||
不同点 | 属性变量 | 可以 | 不可以,必须是初始化常量 |
成员方法 | 可以 | 可以,但全是抽象方法 | |
实现策略 | 必须有子类继承 | 必须有实现类实现 | |
扩展性 | 弱 | 强 | |
构造方法 | 有 | 没有 | |
继承 | 单继承 | 多继承 |
抽象类中可以没有抽象方法,但是有抽象方法的类必须是抽象类