接口

 


1.接口就是一个类的公共规范
2.接口是一种引用数据类型(其中最重要的是抽象方法)
3.定义格式
public interface 接口名称{
//方法内容
}

允许包含的内容:
jdk7:{常量、抽象方法}
jdk8:{常量、抽象方法、默认方法、静态方法}
jdk9(以上):{常量、抽象方法、默认方法、静态方法、私有方法}

使用:
1.接口不能直接使用,需要一个实现类来实现接口;
实现类格式
public class 实现类名称 implements 接口名称{

}
2.接口中的实现类必须覆盖重写接口中所有的抽象方法
3.创建实现类的对象进行使用

注意事项:
1.如果实现类没有覆盖重写接口中所有的抽象方法,那么这个实现类必须是抽象类;
2.接口没有静态代码块或构造方法;
3.一个类的直接父类是唯一的,但是一个类可以同时实现多个接口;
格式:
public class 实现类名称 implements 接口名称1,接口名称2...{

}
4.若实现类所实现的多个接口中,存在重复的抽象方法,那么只需要覆盖重写一次即可;
5.如果实现类实现多个接口中,存在重复的默认方法,那么实现类一定要对冲突的默认方法覆盖重写;
6.一个类如果直接父类中的方法和接口当中的默认方法产生了冲突,那么优先使用父类方法;

接口类的多继承
1.类与接口是多实现的,一个类可以有多个接口;
2.接口与接口是多继承的
(多个父接口的默认方法重复,必须在子类方法中覆盖重写,而且要有default关键字)

定义一个接口:

有一个抽象方法poem01;两个默认方法poem02和poem03;

一个静态方法poemname和一个常变量 NAME_ER="李白"。

 1 public interface Interface01 {
 2     //抽象方法
 3     //格式:public abstract 返回值类型 方法名称(参数);
 4     public abstract  void  poem01();//前面两个关键字是固定的,可以省略(会自动补全);
 5 
 6     //默认方法
 7     /*
 8     格式
 9     public default 返回值类型 方法名称(参数){
10 
11     }
12 
13     默认方法可以被实现类直接调用,也可以被实现类覆盖重写;
14 
15     可以解决接口升级的问题;
16      */
17     public default void poem02(){
18         System.out.println("举杯邀明月,对影成三人");
19     }
20     public default void poem03(){
21         System.out.println("醒时同交欢,醉后各分散");
22     }
23 
24     //静态方法
25     /*
26     格式
27     public static 返回值类型 方法名称(餐数){
28 
29     }
30 
31     不能通过接口实现类对象来调用接口中的静态方法,应直接通过接口名称来调用静态方法
32      */
33     public static void poemname(){
34         System.out.println("月下独酌");
35     }
36 
37     //私有方法
38     /*
39     抽取一个公共方法,解决两个默认(静态)方法重复代码问题,但这个方法不应该让实现类使用,应该私有化;
40     private  (static) 返回值类型  方法名称(参数){
41     方法体;
42     }
43 
44     jdk9以上版本允许私有方法;
45      */
46 
47     //常量
48     /*
49     常量变量必须使用 public static final  三个关键字修饰
50     从效果上看与常量一样;
51     格式
52     public static final 数据类型  常量名 = 数据值;
53     使用:接口名称.常量名
54     (推荐命名:用大写字母和下划线进行分割)
55      */
56     public  static final String  NAME_ER="李白";
57 }

定义另一个接口

独有的抽象方法dynasty;和接口1重名的默认方法poem02和抽象方法poem03;

public interface Interface02 {
    public abstract  void  poem01();
    public abstract  void  dynasty(String str);
    public default  void  poem02(){
        System.out.println("月既不解饮,影徒随我身");
    }
}

定义一个父类

使其拥有与接口1默认方法方法重名的方法poem03;

public class ForAll {
    public void poem03(){
        System.out.println("醒时同交欢,醉后各分散"+"
"+"永结无情游,相期邈云汉");
    }
}

定义一个实现类去继承上述父类并实现两个接口

public class MidAutumn extends ForAll implements Interface01,Interface02{
    @Override
    public void poem01(){
        System.out.println("花间一壶酒,独酌无相亲");
    }

    @Override
    public void poem02() {
        System.out.println("举杯邀明月,对影成三人"+"
"+"月既不解饮,影徒随我身"
                +"
"+"暂伴月将影,行乐须及春"+"
"+"我歌月徘徊,我舞影零乱");
    }

    @Override
    public void dynasty(String str){
        System.out.print(str);
    }


}

输出测试

public class Test04 {
    public static void  main(String[] args){

        Interface01.poemname();//直接用接口明调用静态方法
        MidAutumn poem = new MidAutumn();
        poem.dynasty("唐"+"	");
        System.out.println(Interface01.NAME_ER);
        poem.poem01();
        poem.poem02();
        poem.poem03();//优先用父类的方法
    }
}

输出结果

/*
月下独酌
唐    李白
花间一壶酒,独酌无相亲
举杯邀明月,对影成三人
月既不解饮,影徒随我身
暂伴月将影,行乐须及春
我歌月徘徊,我舞影零乱
醒时同交欢,醉后各分散
永结无情游,相期邈云汉
*/
原文地址:https://www.cnblogs.com/susexuexi011/p/13790375.html