一:接口
1.接口也是一种“引用数据类型”。编译之后也是一个class字节码文件。
2.接口是完全抽象的(抽象类是半抽象的)或者说接口是特殊的抽象类。
3.接口的定义格式:语法:
【修饰符列表】 interface 接口名{}
4.接口支持多继承,一个接口可以继承多个接口
5.接口在开发中的作用:面向接口编程
public class Test01{
main{
//访问接口中的常量
sout(MyMath.PI);
}
}
//定义接口
interface A{
}
//接口支持继承
interface B extends A{
}
//一个接口可以继承多个接口
interface C extends A,B{
}
//我的数学接口
interface MyMath{
//常量
//接口中随便写一个变量就是常量
//public static final double PI = 3.1415926;
double PI = 3.1415926;
int k = 100;
//抽象方法
//public abstract int sum(int a,int b);
//接口中都是抽象方法,那么在编写代码的时候。public abstract可以省略
int sum(int a,int b);
//接口中的方法不能带有主体
void doSome();
//相减的抽象方法
int sub(int a,int b);
}
接口的基础语法:
1.类和类之间叫做继承,类和接口之间叫做实现,继承是extends,实现是implements。
重点!!!:当一个非抽象的类实现接口的话,必须将接口中所有的抽象方法全部实现(覆盖,重写)。
例如:
interface MyMath{
double PI = 3.14;
int sum(int a,int b);
int sub(int a, int b);
}
class MyMathImpl implements MyMath{
//重写/覆盖/实现 接口中的方法(实现!)
public int sum(int a,int b){
return a+b;
}
public int sub(int a,int b){
return a-b;
}
}
重点:一个类可以实现多个接口!
java中类和类之间只支持单继承。
有一个结论:
无论是向上转型还是向下转型,两种类型之间必须要有继承关系。
没有继承关系编译器会报错。(这句话不适用在接口方面)
向下转型养成好习惯。转型之前先if+instanceof进行判断。
总结一句话:解耦合!
面向接口编程,可以降低程序的耦合度,提高程序的扩展力。符合OCP开发原则。
接口的使用离不开多态机制。(接口+多态才可以达到降低耦合度)
任何一个接口都有调用者和实现者。
接口可以将调用者和实现者解耦合。
调用者面向接口调用。
实现者面向接口编写实现。
进行大规模项目的开发,一般都是将项目分离成单个模块,模块和模块之间采用接口衔接,降低耦合度。
类型和类型之间的关系
is a()继承, has a(关联), like a(实现)
is a:
cat is a Animal(猫是一个动物
凡是能够满足is a的表示“继承关系”
has a:
i has a pen(我有一只笔
凡是能够满足has a 关系的表示“关联关系”
关联关系通常以“属性”的形式存在
like a:
cooker like a foodmenu(厨师像一个菜单一样
凡是能够满足like a 关系的表示“实现关系”
实现关系通常是:类实现接口
A implements B
抽象类和接口有什么区别?
extends和implements可以共存,extends在前,implements在后。
使用接口写代码的时候,可以使用多态(父类型引用指向子类型)
一个非抽象的类,实现接口的时候,必须将接口中所有方法加以实现
接口中方法不能有方法体。
接口中所有的元素都是public修饰的
接口中抽象方法的public abstract可以省略
接口中常量的public static final可以省略
抽象类是半抽象的。
接口是完全抽象的。
抽象类中有构造方法。
接口中没有构造方法。
接口和接口之间支持多继承。
类和类之间只能单继承。
一个类可以同时实现多个接口。
一个抽象类只能继承一个类(单继承)。