在jdk1.8中接口中可以定义抽象方法,默认方法,静态方法以及常量。
- 接口中的抽象方法
package com.pyi.blog; public interface AbstractMethod { public abstract void abstractmethod();//这是一个抽象方法。 }接口中的抽象方法必须是两个固定的关键词public abstract修饰,这两个关键词可省略不写,但它们默认修饰接口中的抽象方法。
package com.pyi.blog; public class AbstractMethodTest implements AbstractMethod{ @Override public void abstractmethod() { System.out.println("抽象方法实现!"); } }接口的实现类必须覆盖重写接口中的所有抽象方法,否则这个类要是抽象类。
package com.pyi.blog; public class AbstractTest { public static void main(String[] args) { AbstractMethodTest abs=new AbstractMethodTest(); abs.abstractMethod(); } }运行结果如下:
- 接口中的默认方法
接口中的默认方法是有方法体的,它可以解决接口中的改动升级等问题。在接口中的内容改变时,如再添加一些抽象方法来实现某些功能时,接口的实现类又要覆盖重写接口中新添加的抽象方法,这样操作起来十分麻烦。因此可以在接口中定义默认方法,默认方法可以被实现类继承。实现类对象可直接调用而不需要覆盖重写它。若有需要,接口的实现类对象也可以对接口中的默认方法进行覆盖重写。
package com.pyi.blog;
public interface DefaultMethod {
void abstractMethod();
public default void defaultMethod(){//这是一个默认方法
System.out.println("新增加的默认方法实现!");
}
}
默认方法由default修饰,在接口中默认方法由固定的两个关键字public default修饰,其中public可省略,default不可以省略。
package com.pyi.blog;
public class DefaultMethodTestA implements DefaultMethod{
@Override
public void abstractMethod() {
System.out.println("抽象方法A调用");
}
}
package com.pyi.blog;
public class DefaultTest {
public static void main(String[] args) {
DefaultMethodTestA a=new DefaultMethodTestA();
a.abstractMethod();
a.defaultMethod();
}
}
运行结果如下:
从上面的代码可以看出,在接口的实现类中并没有对接口中的默认方法进行覆盖重写,而接口的实现类对象可以直接调用其中的默认方法。
在接口的实现类中也可以对接口中的默认方法进行覆盖重写:
package com.pyi.blog;
public class DefaultMethodTestA implements DefaultMethod{
@Override
public void abstractMethod() {
System.out.println("抽象方法A调用");
}
@Override
public void defaultMethod(){
System.out.println("实现类覆盖重写了接口中的默认方法!");
}
}
package com.pyi.blog;
public class DefaultTest {
public static void main(String[] args) {
DefaultMethodTestA a=new DefaultMethodTestA();
a.abstractMethod();
a.defaultMethod();
}
}
运行结果如下:
- 接口中的静态方法
接口中的静态方法与对象无关。它带有方法体。
package com.pyi.blog;
public interface StaticMethod {
public static void staticMethod(){//这是一个静态方法
System.out.println("静态方法被调用!");
}
}
package com.pyi.blog;
public class StaticMethodTest implements StaticMethod{
}
package com.pyi.blog;
public class StaticTest1 {
public static void main(String[] args) {
StaticMethodTest sta=new StaticMethodTest();
sta.staticMethod();
}
}
运行结果如下:
此时程序的进行发生了错误。因为静态方法是属于类的,而不是属于对象的,所以不能使用实现类的对象去调用接口中的静态方法。
用实现类名称去调用接口中的静态方法:
package com.pyi.blog;
public class StaticTest1 {
public static void main(String[] args) {
StaticMethodTest sta=new StaticMethodTest();
StaticMethodTest.staticMethod();
}
}
运行结果如下:
此时程序还是报错。其原因是一个类可以实现多个接口,当实现的接口中有重名的静态方法时,使用实现类的名称去调用该重名静态方法则会发生冲突,因此使用相应的接口名称来调用其中的静态方法。
package com.pyi.blog;
public class StaticTest1 {
public static void main(String[] args) {
StaticMethodTest sta=new StaticMethodTest();
StaticMethod.staticMethod();
}
}
运行结果如下:
此时程序运行成功!
- 接口中的常量
接口中可以定义成员变量,而这个成员变量必须是常量,必须使用public static final三个关键字修饰。接口中常量的定义格式为public static final 数据类型 常量名=数据值;。常量一旦赋值就不能被修改。接口中的常量的调用与接口中的静态方法相似,它不能使用实现类对象和实现类名称去调用,而只能通过接口名称调用。
接口中的常量一定要给它赋值,即数据值一定要写出来,否则报错。如下图所示:
package com.pyi.blog;
public interface FinalInterface {
public static final int num=10;//这是一个常量
}
package com.pyi.blog;
public class FinalInterfaceTest implements FinalInterface {
}
package com.pyi.blog;
public class FinalTest {
public static void main(String[] args) {
System.out.println(FinalInterface.num);
}
}
运行结果如下:



