网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
1.接口的基础语法
- 接口也是一种引用数据类型,编译之后也是一个.class字节码文件
- 接口是完全抽象的(抽象类是半抽象)或者也可以说接口是特殊的抽象类
- 接口怎么定义,语法是什么?
[修饰符列表] interface 接口名() - 接口支持多继承,一个接口可以继承多个接口
- 接口中只包含两部分内容:常量、抽象方法
- 接口中所有元素都是public修饰的(都是公开的)
- 接口中的抽象方法定义时,public abstract修饰符可以省略
- 接口中的方法都是抽象方法,所以接口方法中不能有方法体
- 接口常量中的public static final可以省略
注意:(1)类和类之间叫做继承,接口和接口之间叫做实现。别多想,仍然可以将“实现”看作“继承”。继承使用extends关键字完成,实现使用关键字implements完成
(2)当一个非抽象类实现接口的话,必须将接口的所有方法实现(覆盖/重写) - 一个非抽象的类。实现接口的时候,必须将接口的所有方法实现
- 一个类可以实现多个接口
- 使用接口,可以使用多态
例子一:接口多态联合使用
public class Test01{
public static void main(String[] args){
//错误:Mymath是抽象的无法实例化
//new Mymath();
//能使用多态吗?
//可以
//Animal a = new Cat();
//父类型的引用指向子类型的对象
Mymath mm = new MymathImpl();
//调用接口里面的方法(面向接口编程)
int result1 = mm.sum(10,20);
System.out.println(result1);
int result2 = mm.sub(20,10);
System.out.println(reault2);
}
}
//特殊的抽象类,完全抽象的,叫做接口
interface Mymath{
double PI = 3.1415926;
int sum(int a, int b);
int sub(int a, int b);
}
例子二:一个类可以实现多个接口
interface A{
void m1();
}
interface B{
void m2();
}
interface C{
void m3();
}
class D implements A,B,C{
//实现接口A的m1()
public void m1(){
}
//实现接口B的m2()
public void m2(){
}
//实现接口C的m3()
public void m3(){
}
}
注意:一个类可以同时实现多个接口,这种机制弥补了java中类和类只支持单继承,实际上单继承是为了简单而出现的,但现实中存在多继承,java中的接口弥补了单继承带来的缺陷
接口A和接口B之间没关系,也可以强转,编译过程不报错,运行时可能会出现ClassCastException异常。编译没问题,运行结果有问题,像之前一直一样,需要先 if + instanceof 进行判断。
例子三:继承和实现都存在的话怎么写?
extends关键字在前,implements关键字在后
public class Test02{
public static void main(String[] args){
}
}
//动物类:父类
class Animal{
}
//可飞翔的接口(是一对翅膀)
interface Flyable{
void fly();
}
//动物子类:猫类
//Flyable是一个接口,是一对翅膀的接口,通过接口插到猫身上,让猫变得可以飞翔
class Cat extends Animal implements Flyable{
}
接口通常提取的是行为动作。
2.接口在开发中的作用
接口在开发中的作用,类似于多态在开发中的作用
- 接口:是完全抽象,面向接口编程,有了接口就有了可插拔,可插拔表示扩展力强,不是焊死的。
主板和内存条之间有插槽,这个插槽就是接口,内存条坏了,可以重新买一个换下来,这叫做高扩展力(低耦合度)。
接口可以解耦合,解开的是谁和谁的耦合。任何一个接口都有调用者和实现者,接口可以将调用者和实现者解耦合,调用者面向接口调用,实现者面向接口编写实现。
以后项目的开发,一般都是将项目分离成一个模块一个模块的,模块于模块之间采用接口衔接,降低耦合度。
- 多态:面向抽象编程,不要面向具体编程,降低程序的耦合度,提高程序的扩展力
例子四:面向抽象编程好处
public class Master{
public void feed(Dog d){}
public void feed(Cat c){}
//假设又要养其他宠物,那么这个时候需要再加一个方法。(需要修改代码了)
//这样扩展力太差了,违背了OCP原则(对扩展开放,对修改关闭)
}
public class Master{
public void feed(Animal a){
//面向Animal父类编程,父类是比子类更抽象的
//所以我们叫做面向抽象编程,不要面向具体编程
//这样程序的扩展力就强
}
}
3.类型和类型之间的关系:is a 、has a、like a
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
术提升。**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!