public interface 接口名{}
接口(interface)是抽象方法和常量值的定义的集合。
从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
写抽象方法的几种形式,可以省略public abstract 或public 或 abstract都可以。
public interface interfaceDemo01 { public abstract void show(); void eat(); abstract void sleep(); public void study(); }
如果要想实现接口,就要有一个实现类去实现,而且要实现它其中的抽象方法,并且要用implements关键字。形式为实现类名 implements 接口名。
public class test implements interfaceDemo01{ @Override public void show() { } @Override public void eat() { } @Override public void sleep() { } @Override public void study() { } }
在接口中可以有默认方法,形式为 public default 返回值类型 方法名(){ }。
接口中默认方法的实现:
public interface interfaceDemo01 { public abstract void show(); public default void play(){ System.out.println("我在敲代码"); } }
接口中默认方法的调用:需要创建对象
public class demo { public static void main(String[] args) { test t = new test(); t.play(); } }
接口中默认方法还可以被实现类覆盖重写
public class test implements interfaceDemo01{ @Override public void show() { } @Override public void play() { System.out.println("实现类重新接口默认方法"); } }
在接口中可以有静态方法,形式为 public static 返回值类型 方法名(){ }。
接口中静态方法的实现:
public interface interfaceDemo01 { public abstract void show(); public default void play(){ System.out.println("我在敲代码"); } public static void moYu(){ System.out.println("上课摸鱼"); } }
接口中静态方法的调用:不需要创建对象,直接可以用 接口名.静态方法名();即可
public class demo { public static void main(String[] args) { test t = new test(); t.play(); interfaceDemo01.moYu(); } }
接口中静态方法不能被实现类重写,因为它属于接口独有,并且在实现类中可以定义一个与接口中静态方法方法名相同的静态方法,则这个静态方法归实现类独有。
在接口中定义常量,形式为public final 数据类型 变量名 = 数值;。这里面的public 和 final都可以省略掉。
public interface interfaceDemo01 { public int m = 100; public final int n = 10; int w = 100; public abstract void show(); public default void play(){ System.out.println("我在敲代码"); } public static void moYu(){ System.out.println("上课摸鱼"); } }
public class test implements interfaceDemo01{ @Override public void show() { System.out.println(m); System.out.println(n); System.out.println(w); } @Override public void play() { System.out.println("实现类重新接口默认方法"); } public static void moYu(){ System.out.println("实现类独有"); } }
Java中的继承都是单继承的,就是说一个父类可以被多个子类继承但是一个子类只能有一个父类。但是一个接口可以被不同实现类去实现,这就是我们说的Java中的多态的概念。下面我们再来说一下接口的多继承的概念,就是说一个接口是可以继承多个接口的。
一个实现类可以继承多个接口,但要实现每个接口中的抽象方法。不过如果接口中存在相同的接口默认方法(也就是两个接口中默认方法名相同),这就是接口默认方法冲突。这个解决办法就是在实现类中覆盖重写该默认方法即可。
如果接口默认方法名和另一个接口的抽象方法同名,返回值类型也相同,这种冲突可以通过实现类覆盖重写该方法来解决问题。但是若返回值类型不相同则无法解决该问题,因为这纯属没事闲的才这样做。
一个类既可以继承父类也可以是很多接口的实现类。形式为:类名 extends 父类名 implements 接口名,接口名...
当父类的成员方法名和接口中的默认方法名相同时,返回值类型也相同,则优先继承父类,即不显式的实现接口也不会报错。
当父类的成员方法名和接口中的抽象方法名相同时,返回值类型也相同,则优先继承父类,即不显式的实现接口也不会报错。(这句话的意思就是因为子类继承了父类中的成员方法相当与覆盖重写了接口中的抽象方法,所以子类中可以不实现该抽象方法,调用时直接调用父类中的该成员方法即可)。
public class Fu { public Fu() { } public void play(){ System.out.println("我在玩"); } public void s(){ System.out.println("m"); } }
public interface interfaceDemo01 { public int m = 100; public final int n = 10; int w = 100; public abstract void show(); public default void play(){ System.out.println("我在敲代码"); } public static void moYu(){ System.out.println("上课摸鱼"); } }
public interface interfaceDemo02 { public abstract void show(); void s(); }
public class test extends Fu implements interfaceDemo01,interfaceDemo02{ @Override public void show() { System.out.println(m); System.out.println(n); System.out.println(w); } public static void moYu(){ System.out.println("实现类独有"); } }
public class demo { public static void main(String[] args) { test t = new test(); t.show(); t.play(); t.s(); interfaceDemo01.moYu(); test.moYu(); } }
输出结果:
100
10
100
我在玩
m
上课摸鱼
实现类独有