抽象-接口
接口
JAVA是只支持单继承的,但可以多实现,也就是类可以实现多个接口
接口是一种规则,是一种约束,使用者必须按照其规定使用。比如usb接口可以为设备间提供快速传输,也可以供设备充电,使用者必须要有一个usb接口,不能是两脚的插头或三脚的;要想使用使用3.0的传输效率,接口就必须要遵守协议。
比起抽象类,接口更抽象。在接口中,没有构造器,方法都是抽象的,不提供任何实现。接口中不能定义变量,所有的变量必须以public static final
修饰,也就是所有的属性都是静态常量。接口同抽象类一样不能实例化。
1.声明与实现
像声明类一样,class
是声明类的关键字,而interface
是声明接口的关键字;实现接口也像继承类一样,extends
是继承,implements
是实现;实现要写在继承后面。
public interface JavaInterFace{
public abstract void methods();
void run();//默认修饰public abstract
}
//接口的实现类名称一般会以Int结尾
public class TypeClass Intextends Object implements JavaInterFace{
@Override
public void Methods(){
//code
}
}
接口中,所有的方法默认被
public abstract
修饰,所有的变量默认被public static final
修饰
接口与接口间也可以继承,实现子接口的类要重写所有接口的抽象方法
public interface A{ void TestA();}
public interface B{ void testB();}
public interface C extends A,B{ void testC(); }
public class Test implements C{
@Override
public void testA(){}
@Override
public void tetsB(){}
@Override
public void TetsC(){}
}
public class TestB implements B{
@Override
public void tetsB(){}
}
public static void main(String[] args){
C c = new Test();
System.out.println(c instanceof A);
System.out.println(c instanceof B);
System.out.println(c instanceof C);
System.out.println(c instanceof Test);
System.out.println(c instanceof Object);
System.out.println(c instanceof TestB);
System.out.println(c instanceof Student);
System.out.println(c instanceof String);//编译报错,String是一个final修饰的类
}
/**
true
true
true
true
true
true
false
Process finished with exit code 0
*/
var instanceof TypeClass
,如果var是一个接口引用类型的变量,那只要TypeClass
不是一个final
修饰的类,这个代码就行通过编译。至于其执行的结果就要看var所指向的实际类型,是不是var引用类型的子类或实现类
2.作用
- 规范化,对实现接口的类必须重写实现其抽象方法
- 统一访问,虽然接口不能实例化,但接口可以作为引用类型,定义指向其实现类的对象
Interface var = new classtype()
,这样在需要调用不同实现类的方法时,也可以不用改变大量的代码,因为不同实现类其内部的功能也大致相同(都是实现同一个接口),需要调用不同类时,只需改变classtype
即可,
3.Java8
在Java 8前,接口中只能包含抽象方法;而在Java 8允许接口可以具有静态方法和默认方法
public interface InerfaceBace{
void test();
default void go(){
System.out.println("InerfaceBace.defaultGo()!!");
}
static void to(){
System.out.println("InerfaceBace.staticTo()!!!");
}
}
public class InterfaceBaceInt implements InterfaceBace{
void test(){
//code
}
}
InerfaceBace bace = new InerfaceBaceInt();
bace.go();
InerfaceBace.to();
/*
InerfaceBace.defaultGo()!!
InerfaceBace.staticTo()!!!
Process finished with exit code 0
*/
接口的静态方法也可以通过接口名去调用
InterfaceType.methods()
;默认方法即通过引用该接口类型的对象去调用(多态)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通