java不支持多继承性,即一个类只能有一个父类。
为了解决单继承的缺点,java使用了接口
接口是一种引用数据类型,最重要的内容是抽象方法
(public) interface 接口名称{
//接口内容
}
接口声明时,如果关键字interface前面加上public->public接口,可以被任何一个类使用
如果一个接口不加public修饰->友好接口类,可以被同一个包中的类使用
java7接口中可以包含
常量
抽象方法
java8接口中额外包含:
默认方法
静态方法
java9接口额外包含:
私有方法
接口抽象方法:
注意:接口当中的抽象方法,修饰符必须是两个固定的关键字,publicabstract
这两个关键字修饰符,可以选择性地省略
使用:
接口不能直接使用。必须有一个实现类来实现接口
格式:publicclass类名称implements接口名称{//..}
接口的实现类必须覆盖重写接口中所以的抽象方法
创建实现类的对象,进行调用
public interface MyInterface {
public abstract void method();
void method1();
}
public class a implements MyInterface{
@Override
public void method() {
System.out.println('这是第一个方法');
}
@Override
public void method1() {
System.out.println('这个是第二个方法');
}
}
public class b {
public static void main(String[] args) {
a aa=new a();
aa.method();
aa.method1();
}
}
如果实现类并没有覆盖重写接口中所有的抽象方法,那么这个实现类自己必须是一个抽象类
接口的默认方法:
格式:publicdefault返回值类型方法名称{方法体}public可以省略
接口中的默认方法
可以解决接口升级的问题
可以和函数式编程结合
如果一个接口有已经定义许多个子类,但是如果在接口中又新增了一个方法,为了让子类都覆盖了抽象方法,就不得不在每一个子类中都覆盖这个新加的抽象方法,但是这样又会很麻烦。
所以可以把新添加的方法改为默认方法
public interface MyInterface {
void method();
public default void method1(){
System.out.println('新添加的方法');
}
}
public class a implements MyInterface {
@Override
public void method() {
}
}
public class b {
public static void main(String[] args) {
a aa=new a();
aa.method();
aa.method1();
}
}
接口的默认方法会被子类继承,可以由子类调用
这样就可以不用全部都重新覆盖,但子类仍然可以调用新添加的方法
注意:接口的默认方法也可以被子类覆盖重写
接口的静态方法:
publicstatic返回值方法名称{方法体}public可以省略
不能通过接口实现类的对象来调用接口当中的静态方法
通过接口名称,直接调用其中的静态方法:
接口名称.静态方法名
public interface MyInterface {
public static void method1(){
System.out.println('调用静态方法');
}
}
public class b {
public static void main(String[] args) {
MyInterface.method1();
}
}
接口的私有方法:
如果需要抽取一个共有方法,用来解决两个默认方法之间重复代码的问题。
但是这个共有方法不应该让实现类使用,应该是私有化的。
应该把这个共有方法实设为私有的
普通私有方法,解决多个默认方法之间重复代码问题:
private返回值类型方法名称{
方法体}
静态私有方法,解决多个静态方法之间重复代码问题:
格式:privatestatic返回值方法名称{
方法体}
public interface MyInterface {
public default void method1(){
method();
}
public default void method2(){
method();
}
private void method(){
System.out.println('111');
}
}
public class a implements MyInterface {
}
public class b {
public static void main(String[] args) {
a aa=new a();
aa.method1();
aa.method2();
}
}
public interface MyInterface {
public static void method1(){
method();
}
public static void method2(){
method();
}
private static void method(){
System.out.println('111');
}
}
public class a implements MyInterface {
}
public class b {
public static void main(String[] args) {
MyInterface.method1();
MyInterface.method2();
}
}
接口的常量
接口当中也可以定义”成员变量“,但是必须使用publicstaticfinal三个关键字进行修饰
从效果上看,其实是接口的【常量】
publicstaticfinal数据类型常量名称=数据值;
注意:
一旦使用final关键字进行修饰,说明不可改变
接口中的常量,可以省略【public】【static】【final】,注意,不写照样也是这样
接口中的常量,必须进行赋值,不能不赋值
常量的命名为大写,且用下划线分割
常量的使用:
public interface MyInterface {
public static final int NUM=10;
}
public class b {
public static void main(String[] args) {
System.out.println(MyInterface.NUM);
}
}
使用接口时候,需要注意:、
接口是没有静态代码块或者构造方法的
一个类的直接父类是唯一的,但是一个类可以同时实现多个接口
接口也是可以被继承的,可以通过关键字extends声明一个接口是另一个接口的子接口,子接口将继承父接口中全部方法和常量
接口与接口之间是多继承的
多个父接口当中的抽象方法如果重复没有关系
(多个父接口当中的默认方法如果重复,那么子接口必须进行默认方法的覆盖重写【带default关键字】
父类实现了某个接口,那么子类就自然实现了该接口,子类不必再显示地使用关键字Implements声明
如果实现类所实现的多个接口中,存在重复的抽象方法,那么只需要覆盖重写一次
如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类就必须是一个抽象类
如果实现类所实现的多个接口当中,存在重复的默认方法,那么类一定要对冲突的默认方法进行覆盖重写
一个类如果直接父类当中的方法和接口当中默认方法产生了冲突,优先用父类当中的方法
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点