1-1总述
1、接口也是一种引用数据类型。
2、接口是完全抽象的(抽象类是半抽象,接口是特殊的抽象类)
基础语法:
[修饰符列表] interface 接口名{
}
3、接口支持多继承,一个接口可继承多个接口
4、接口中只有两部分内容:抽象方法、常量。
5、接口中所有元素都是public修饰(都是公开的)
6、抽象方法定义时:public abstract可以省略
常量定义时:public static final可以省略,常量不能被重新赋值,接口中随便写一个值就是常量。
7、接口中的方法都是抽象方法,不能有方法体(即不存在实例方法)
8、类和接口之间称为实现,immplents关键字。(可理解为多态)
9、由于接口是特殊的抽象类,当非抽象类实现接口时,必须实现接口中的抽象方法,重写方法时,其方法访问权限必须更高
10、接口也是特殊类,也可以作为某类的一个属性,但必须实现才能实例化
public class inter implements A{
public int sum(int a,int b){
return a+b;
}
}
interface A{
int i=5;
int sum(int a,int b);
}
若删掉重写方法中的public,则访问权限变低了,会报错。
接口内的多态:
A pd=new inter();
int m=pd.sum(5,5);
接口引用指向继承子类对象实体
10、一个类可以同时实现多个接口,这种机制弥补了单继承带来的缺陷,实现多接口类似于多继承
小插曲:被一个类实现的不同接口A、B,A可以向下转型为B,运行通过。
经过测试:接口和接口之间进行强制类型转换的时候,没有继承关系,也可以强转。但是有可能运行时会出现ClassCastException.
之前结论:无论向上转型还是向下转型,两种类型间必须有继承关系,不然编译无法通过(这个结论在接口中不适用),但最好在转型前加instanceof运算符进行判断。
A a= new inter();
if(a instanceof B) {
B b = (B) a;
}
11、继承和实现都存在:
public class inter extends animal implements A,B
继承在前,实现在后
1-2 接口在开发中的作用
面向抽象编程——面向接口编程
有了接口可插拔,扩展能力强,低耦合度,符合OCP开发原则
Cat is a animal, 但凡满足is a的表示都可以设置为继承
Customer has a menu/ Customer use menu to food, 但凡以这种逻辑方式存在(即A对象拥有B,B可以是一种对象引用,一个接口引用,一个数值等其他变量)都以属性的形式存在.
interface Foodmenu{
void zhongcan();
void xican();
}
class customer implements Foodmenu{
Foodmenu a;
inter b;
public void zhongcan() { }
public void xican() { }
public static void main(String[] args) {
inter c;
}
}
顾客使用菜单获得食物,所以可把菜单接口作为属性,则 a 为实例变量(属于成员变量),存在堆中,b也为实例变量,而c在方法体中声明,为局部变量,存在于栈中。
接口一定离不开多态:因为接口的引用只能指向实现它的类实体——向上转型
面向抽象编程:接口的运用
interface Foodmenu{
void food();
}
public class Chinesecooker implements Foodmenu{ //中餐厨师实现该菜单接口,重写相应的食物方法
public void food() {
System.out.println("中餐:鱼香肉丝");
}
}
public class Westerncooker implements Foodmenu { //西餐厨师实现该菜单接口,重写相应的食物方法
public void food() {
System.out.println("西餐:六分熟牛排");
}
}
public class Customer {
private Foodmenu foodmenu ; //接口引用作为私有变量,向下转型,多态
public Customer(Foodmenu foodmenu) { //顾客类将菜单接口作为其属性,通过该菜单接口点不同种类的菜
this.foodmenu = foodmenu;
}
public Customer(){
}
public Foodmenu getFoodmenu() {
return foodmenu;
}
public void setFoodmenu(Foodmenu foodmenu) {
this.foodmenu = foodmenu;
}
public void order(){
foodmenu.food();
}
}
public class Vartest {
public static void main(String[] args) {
Foodmenu cooker1=new Chinesecooker(); //接口的向下转型,指向实现它的Chinesecooker类
Customer c=new Customer(cooker1);
c.order();
Foodmenu cooker2=new Westerncooker();
c.setFoodmenu(cooker2);
c.order();
}
}
上述中/西餐厨师——菜单——顾客为面向接口的抽象编程的一个实例应用。
接口可以将接口调用者和实现者解耦和,调用者(customer)不用管实现者(Chinesecooker/Westerncooker).
上述例子厨师实现菜单接口,顾客调用该菜单接口。
模块和模块之间采用接口衔接,降低耦合度。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)