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 }
定义另一个接口
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();//优先用父类的方法 } }
输出结果
/* 月下独酌 唐 李白 花间一壶酒,独酌无相亲 举杯邀明月,对影成三人 月既不解饮,影徒随我身 暂伴月将影,行乐须及春 我歌月徘徊,我舞影零乱 醒时同交欢,醉后各分散 永结无情游,相期邈云汉 */