Javase进阶 接口的语法和接口的作用
p499-p516
关键词: 接口 implements 面向抽象编程 OCP开闭原则
接口的基础语法
1、接口也是一种引用数据类型,编译之后也是一个class字节码文件
2、接口是完全抽象的。(抽象类是半抽象。)
也可以理解为是特殊的,完全抽象的类
3、接口怎么定义,语法是什么?
[修饰符列表] interface 接口名{}
4、接口和接口之间支持多继承,一个接口可以继承多个接口。
例如 interface C extends A,B也没问题,不会报错
5、接口中只包含两部分
常量和抽象方法
接口中没有其他内容了,只有以上两部分
6、接口中所有的元素都是public修饰的。(都是公开的)
7、接口中的抽象方法定义时:public abstract可以省略
8、接口中的常量的public static final 可以省略
9、接口中的方法都是抽象方法,因此接口中的方法不能有方法体
10、类和类叫继承,类和接口之间叫做实现
继承用extends关键字完成 实现用implements关键字完成
11、当一个非抽象的类实现接口的话,必须将接口中所有的抽象方法全部实现(覆盖/重写)。
12、一个类可以同时实现多个接口
这种机制弥补了java中类和类只能单继承,但是也一定要将所有接口的抽象方法都进行实现。
13、接口和接口之间在进行强制类型转换时候,没有继承关系,也可以强转。编译器可以通过
但是注意java.lang.ClassCastEception转之前也用if+instanceof来判断(这点可以不用太在意)
14、继承和实现懂存在的话,extends关键字在前,implements接口在后
15、使用接口,写代码的时候,可以使用多态(父类型引用指向子类型对象)
例:
class Cat extends Animal implements Flyable 根据这种写法
练习了个小例子,里面也用了多态
public class Test {
public static void main(String[] args) {
//多态
Flyable c = new Cat();
c.fly();
Flyable p = new Pig();
p.fly();
Flyable f = new Fish();
f.fly();
}
}
class Animal{
}
interface Flyable{
void fly();
}
class Cat extends Animal implements Flyable{
public void fly(){
System.out.println("会飞的猫,天猫!");
}
}
class Pig extends Animal implements Flyable{
public void fly(){
System.out.println("我是飞天小猪猪");
}
}
class Fish extends Animal implements Flyable{
public void fly(){
System.out.println("我是六眼飞鱼");
}
}
接口在开发中的作用
注意:接口在开发中的作用,类似多态在开发中的作用
多态:面向抽象编程,不要面向具
接口是不是完全抽象的?
是的而我们以后正好要求,面向抽象编程。
面向冲向编程这句话可以修改为:面向接口编程。
面向接口就有了可插拔,可插拔表示扩展力很强。不是焊接死的
例:
接口在现实世界中是不是到处都是那?
螺栓和螺母之间有接口
灯泡和灯口之间有接口
笔记本电脑和键盘之间有接口(usb接口,usb接口是不是某个计算机协会制定的规范?)
接口有什么用?扩展性,可插拔。
接口是一个抽象的概念。
分析:
中午去饭馆吃饭,这个过程中有接口吗?
接口是抽象的
菜单是一个接口。(菜单上面有一个抽象的照片:西红柿炒蛋)
谁面向接口调用。(顾客面向菜单点菜,调用接口)
谁负责实现这个接口。(后台厨师负责把西红柿炒蛋做好!是接口的实现者)
这个接口有什么用呢?
这个饭馆的菜单,让顾客和后厨解耦合了。
顾客不用找后厨,后厨不用找顾客,他们完全通过这个抽象的菜单沟通。
对于上面的话,写一个接口实现的作用的例子:
// 顾客
public class Customer{
// 顾客手里有一个菜单
// Customer has a FoodMenu!(这句话什么意思:顾客有一个菜单)
// 记住:以后凡是能够使用 has a 来描述的,统一以属性的方式存在。
// 实例变量,属性
// 面向抽象编程,面向接口编程。降低程序的耦合度,提高程序的扩展力。
private FoodMenu foodMenu;
// 如果以下这样写,就表示写死了(焊接了。没有可插拔了。)
// 中餐厨师
//ChinaCooker cc;
// 西餐厨师
//AmericCooker ac
// 构造方法
public Customer(){
}
public Customer(FoodMenu foodMenu){
this.foodMenu = foodMenu;
}
// setter and getter
public void setFoodMenu(FoodMenu foodMenu){
this.foodMenu = foodMenu;
}
public FoodMenu getFoodMenu(){
return foodMenu;
}
// 提供一个点菜的方法
public void order(){
// 先拿到菜单才能点菜
// 调用get方法拿菜单。
//FoodMenu fm = this.getFoodMenu();
// 也可以不调用get方法,因为在本类中私有的属性是可以访问
foodMenu.shiZiChaoJiDan();
foodMenu.yuXiangRouSi();
}
}
/*
接口:菜单,抽象的
*/
public interface FoodMenu{
// 西红柿炒蛋
void shiZiChaoJiDan();
// 鱼香肉丝
void yuXiangRouSi();
}
//中餐厨师
// 实现菜单上的菜
// 厨师是接口的实现者。
public class ChinaCooker implements FoodMenu{
// 西红柿炒蛋
public void shiZiChaoJiDan(){
System.out.println("中餐师傅做的西红柿炒鸡蛋,东北口味!");
}
// 鱼香肉丝
public void yuXiangRouSi(){
System.out.println("中餐师傅做的鱼香肉丝,东北口味!");
}
}
//西餐厨师
// 实现菜单上的菜
// 厨师是接口的实现者。
public class AmericCooker implements FoodMenu{
// 西红柿炒蛋
public void shiZiChaoJiDan(){
System.out.println("西餐师傅做的西红柿炒鸡蛋!");
}
// 鱼香肉丝
public void yuXiangRouSi(){
System.out.println("西餐师傅做的鱼香肉丝!");
}
}
public class Test{
public static void main(String[] args){
// 创建厨师对象
//FoodMenu cooker1 = new ChinaCooker();
FoodMenu cooker1 = new AmericCooker();
// 创建顾客对象
Customer customer = new Customer(cooker1);
// 顾客点菜
customer.order();
}
}
总结一句话:三个字“解耦合”
面向接口编程,可以降低程序的耦合度,提高程序的扩展力。符合OCP开发原则。
接口的使用离不开多态机制。(接口+多态才可以达到降低耦合度。)
接口可以解耦合,解开的是谁和谁的耦合!!!
任何一个接口都有调用者和实现者。
接口可以将调用者和实现者解耦合。
调用者面向接口调用。
实现者面向接口编写实现。
以后进行大项目的开发,一般都是将项目分离成一个模块一个模块的,
模块和模块之间采用接口衔接。降低耦合度。
对于Is a 、 has a、 like a
Is a :extends
Cat is an Animal 猫是一个动物
凡是能够满足is a 的表示 继承关系
has a :
I have a pen
凡是能够满足have a 关系的表示关联关系
关联关系通常以属性的形式存在。
like a :implements
Cooker like a FoodMenu(厨师像一个菜单一样)
凡是能够满足like a关系的表示实现关系
实现关系通常是:类实现接口
抽象类和接口有什么区别?
在这里我们只说一下抽象类和接口在语法上面的区别
至于以后抽象类和接口应该怎么进行选择,通过以后项目去学习和体会。
抽象类是半抽象的。
接口是完全抽象的。
抽象类中有构造方法。
接口类中没有构造方法。
接口和接口之间支持多继承。
类和类之间只能单继承。
一个类可以同时实现多个接口
一个抽象类只能继承一个类
接口中只允许出现常量和抽象方法。
这里透露一个信息:
以后接口比抽象类多,一半抽象类的使用还是少。
接口一般是对行为的抽象
今日心得总结
今天刚从老家回来,坐了七个小时的车,回来还是坚持学习到现在,然后发布这篇文章,真的有点小累,但是没事,坚持,坚持才是胜利!!
少年易老学难成,一寸光阴不可轻。
绳锯木断,水滴石穿。
长风破浪会有时,直挂云帆济沧海!