一、接口概念和作用
1.接口语法
interface 接口名{
// 静态常量,抽象方法
}
说明:① 声明一个接口使用关键字interface,而不是class,class是用来声明一个类,class和interface是属于同一个级别的。
② 接口里面存放的内容只能是静态常量、抽象方法,其它带方法体的方法或普通的属性都不能放到接口里面。
③ 接口不能实例化。
2.接口的特点
(1)接口中只能放静态常量、抽象方法。
(2)java接口是对功能的扩展(父类和抽象类中一般都存放的是通用的属性和方法,我们一般把扩展的功能或特有的功能放到接口里,而不放在父类或抽象类中)。
(3)通过实现接口,java类可以实现多实现(一个类可以实现多个接口,即一个类可以有多种功能)。
(4)一个类只能继承一个父类,即extends关键字后面只能跟一个父类,但可以通过implements关键字实现,多个接口。
(5)接口与接口之间可以通过extends关键字来产生继承关系(即接口继承接口使用关键字extends)。
3.接口与抽象类的区别
(1)抽象类与实现类之间是一种继承关系,也就是说如果采用抽象类的方式,则父类与子类在概念上应该是相同的。
(2)接口和实现类在概念上不要求相同,接口只是抽取相互之间没有关系的类的共同特征,而不去关注类之间的关系,它可以使没有层次关系的类具有相同的行为。
(3)抽象类是对一组具有相同属性和行为的逻辑上有关系的事物的一种抽象,而接口是对一组具有相同属性和行为的逻辑上不相关的事物的一种抽象。
(4)对于接口和抽象类的选择,反映出设计人员看待问题的不同角度。抽象类用于一组相关的事物,表示的是"is-a"(继承)的关系,而接口用于一组不相关的事物,表示的是"like-a"(具备)的关系。
抽象类实例:
public class AbstractDemo {
public static void main(String[] args) {
Child child = new Child();
child.feed();
Dog dog = new Dog();
dog.feed();
}
}
abstract class Animal {
public abstract void feed();
}
class Child extends Animal{
@Override
public void feed() {
System.out.println("吃米饭");
}
}
class Dog extends Animal {
@Override
public void feed() {
System.out.println("啃骨头");
}
}
// 接口中只能放公有的静态常量和抽象方法
public static final int number = 1;(就算你直接定义成int number = 1 这样,在这里不写public static final ,程序在编译时也会自动加上,默认是有的,而且它们的顺序可以互换,颠倒。一般推荐写全。接口中的静态常量或抽象方法的访问方式:接口名.变量名(抽象方法名))。
// 抽象方法在这里同静态常量一样,public abstract 可以不写,编译时系统会自动加上,而且这里的访问修饰符只能是public,因为接口是一种能力,我要让它的实现类去实现,假设是private,那么写这个方法又有何意义呢?(在JDK1.8之后,接口中可以放一般的方法,但要使用default来修饰)
public abstract void show();
public class PersonDemo {
public static void main(String[] args) {
Cat cat = new Cat();
Child child = new Child();
feed(child);
feed(cat);
}
// 接口的引用变量可以引用其实现类的对象,即接口实现了多态。
public static void feed(IAbility iAbility) {
iAbility.eat();
}
}
interface IAbility {
public abstract void eat();
}
class Cat implements IAbility {
@Override
public void eat() {
System.out.println("吃鱼肉");
}
}
class Child implements IAbility {
@Override
public void eat() {
System.out.println("吃火锅");
}
}
4.面向接口编程
开发系统时,主体架构使用接口,接口构成系统的骨架,这样就可以通过更换接口的实现类来更换系统的实现。
public class InterfaceOrientedDemo {
public static void main(String[] args) {
ACorpAdvertisement aCorpAdvertisement = new ACorpAdvertisement();
BCorpAdvertisement bCorpAdvertisement = new BCorpAdvertisement();
AdvertisementBoard advertisementBoard = new AdvertisementBoard();
advertisementBoard.show(aCorpAdvertisement);
advertisementBoard.show(bCorpAdvertisement);
}
}
interface Advertisement{
// 广告词
public abstract void showAdvertisement();
// 公司名
public abstract String getCorpName();
}
/**
* A广告公司
*/
class ACorpAdvertisement implements Advertisement{
@Override
public void showAdvertisement() {
System.out.println("AAAAAAorp");
}
@Override
public String getCorpName() {
return "A Corp";
}
}
/**
* B广告公司
*/
class BCorpAdvertisement implements Advertisement{
@Override
public void showAdvertisement() {
System.out.println("BBBBBorp");
}
@Override
public String getCorpName() {
return "B Corp";
}
}
/**
* 广告牌
*/
class AdvertisementBoard {
public void show(Advertisement advertisement) {
System.out.println(advertisement.getCorpName() + "广告词:");
advertisement.showAdvertisement();
}
}