1.可以使用interface关键字来定义一个接口,定义方式和类很相似,分为接口的声明和接口体
interface Advertisement {
int TYPE = 1; //只有常量:省略public、final、static修饰符
void f(); //省略public、abstract修饰符
}
2.注意点
1)interface可以加访问修饰符(public protected 无 private)
2)接口体中包含常量的声明(无变量)和抽象方法两部分。且:
常量的访问权限是public的,是static常量 (可省略public、final、static修饰符)
方法一定是抽象的,访问权限是public的 (可省略public、abstract修饰符)
在java中接口不能直接new出它的实例对象,需要由类来实现,以便使用接口中的方法。一个类可以在声明时使用implements关键字声明该类实现了一个或多个接口。(不同于类的继承,java的类可以实现多个接口,接口之间用逗号**","**隔开。
以实现上面的Adverment为例:
public class HuaWei implements Advertisement {
@Override
public void showAdvertisement() {
}
@Override
public String getCorName() {
return null;
}
}
注意:
1.如果一个类声明一个接口,没有重写接口中的所有方法,那么这个类一定是抽象类(即普通的非抽象类必须重写接口的所有方法,二抽象类既可以重写接口里的方法,也可以直接拥有接口里的方法)
2.如果父类实现了某个接口,那么这个类的子类不必显式地使用关键字implements来声明这个接口
3.接口之间也可以继承
接口的UNL图和表示类的UML图类似,使用一个长方形来描述一个接口的主要构成,将长方形垂直地分为三层。
顶部第一层:名字层,接口名字必须是斜体字形,而且需要用**<>**修饰名字,分列在两行
第二层:常量层
第三层:方法层,也叫操作层
接口属于引用型变量。接口变量中可以存放实现该接口的类的实例(对象)的引用。
接口回调是:可以把实现某一接口的类创建的对象的引用赋值给该接口声明的接口变量,那么该接口就可以调用被类实现的接口方法。(类似于上转型对象调用子类重写的方法)
特别注意:接口无法调用类中的其他非接口方法
由接口产生的多态就是指:不同的类在实现同一个接口时可能具有不同的实现方式,那么接口变量在回调接口方法时就可能具有多种形态
如:上面的接口Advertisement定义了抽象方法showAdvertisement(),(作用为显示广告信息),当然对于不同的类,其重写showAdvertisement()方法的情况就不一样,这就构成了多态。
abstract类与接口的比较如下:
1)**对于方法:**abstract类可以有抽象方法也可以有非抽象的方法;而接口只能由抽象方法
2)**对于属性:**接口里只能有常量,不能有变量;abstract类既可以有常量,又可以有变量
在设计程序时,学习怎样面向接口去设计程序。接口只关心操作(抽象出重要的行为标准),不必关心这些操作的具体实现细节,我们可以把精力放在程序的设计上,不必拘泥于具体细节的实现!
具体实例:
该实例的UML图见目录3中
1)Advertisement接口
/**
* @auther 黄勇 湖南师范大学
* 邮箱:[email protected]
* CSDN主页:https://me.csdn.net/qq_44871442
* @data 13:34
*/
public interface Advertisement {
int TYPE = 1; //只有常量:省略public、final、static修饰符
void showAdvertisement(); //省略public、abstract修饰符
public String getCorName();
}
2)两个实现接口的类
public class HuaWei implements Advertisement {
@Override
public void showAdvertisement() {
System.out.println("*********************");
System.out.println("中华有为!");
System.out.println("*********************");
System.out.println("");
}
@Override
public String getCorName() {
return "华为公司";
}
}
public class BaiDu implements Advertisement {
@Override
public void showAdvertisement() {
System.out.println("#####################");
System.out.println("优秀的互联网公司");
System.out.println("#####################");
System.out.println("");
}
@Override
public String getCorName() {
return "百度公司";
}
}
3)主类
/**
* @auther 黄勇 湖南师范大学
* 邮箱:[email protected]
* CSDN主页:https://me.csdn.net/qq_44871442
* @data 17:16
*/
public class AdvertisementBoard {
public void show(Advertisement adver){
System.out.println(adver.getCorName()+"的广告词如下:");
adver.showAdvertisement();
}
public static void main(String args[]){
AdvertisementBoard adboard = new AdvertisementBoard();
adboard.show(new HuaWei());
adboard.show(new BaiDu());
}
}