interface能用来修饰的只要类
interface在jdk7及以前的使用
1.在jdk7中interface只能有全局变量和抽象方法
2.全局变量默认为 public static final
3.抽象方法默认为 public abstract
4.接口中无法定义构造器 ,意味着接口无法实例化。
5.接口的使用,使用 implements 来实现该接口(如果实现类覆盖了接口中的所有抽象方法,那么此类就是一个普通的类,则此实现类就可以实例化,如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类)
6.Java中接口是多实现的
interface A{
public abstract void getMethodA();
}
interface B{
public abstract void getMethodB();
}
class c implements A,B{
@Override
public void getMethodA() {
}
@Override
public void getMethodB() {
}
}
6.如果在一个类中需要同时继承一个类实现一个或者多个接口时,继承(extends)要写在实现(implements)的前面
7.类和类之间可以继承,类和接口之间可以实现,接口和接口之间也是可以继承的,并且该继承可以是多继承
interface D{
public abstract void getMethodD();
}
interface E{
public abstract void getMethodE();
}
// 接口之间的多继承
interface F extends D,E{
}
interface在jdk8的使用
1.interface关键字在jdk8版本当中除了可以定义全局变量和抽象方法之外,还可以定义静态方法和默认方法
interface InterfaceJava8Test1{
// 静态方法
public static void getStaticMethod1(){
System.out.println("InterfaceJava8Test1的静态方法");
}
// 默认方法
public default void getDefaultMethod2(){
System.out.println("InterfaceJava8Test1的默认方法");
}
}
2.再默认方法中如果不使用访问修饰符修饰符默认为public修饰符,而不是default修饰符 提示内容:修饰符public对于interface修饰的是多余的
3.接口中的静态方法和默认方法实现类中不需要继续方法的覆盖
interface InterfaceJava8Test1{
// 静态方法
public static void getStaticMethod1(){
System.out.println("InterfaceJava8Test1的静态方法");
}
// 默认方法
public default void getDefaultMethod2(){
System.out.println("InterfaceJava8Test1的默认方法");
}
}
// 实现类
class InterfaceJava8Test2 implements InterfaceJava8Test1{
}
4.接口中静态方法,实现类无法调用,它只能由接口本身调用
5.实现类的对象可以直接调用接口中的默认方法,并且接口本身无法调用自身的默认方法
6.实现了可以重写接口中的默认方法,再调用时,调用的为该类重写后的方法
7.如果子类或者实现类中继承的父类和实现接口中声明的同名同参数的方法一样,并且再其子类或者父类没有进行方法重写覆盖时,默认调用的是该父类中的方法 (只适用于方法,不适用于属性)
public class InterfaceJava8 {
public static void main(String[] args)
{
InterfaceJava8Test2 in2=new InterfaceJava8Test2();
// in2.getStaticMethod1(); //静态方法无法实现类来调用 只能由接口本身来调用
in2.getDefaultMethod2();
InterfaceJava8Test1.getStaticMethod1(); // 接口本身调用静态方法
// InterfaceJava8Test1.getDefaultMethod2(); //接口本身无法调用自身的默认方法
in2.getDefaultMethod3(); // 输出结果为父类中的结果
}
}
interface InterfaceJava8Test1{
// 静态方法
public static void getStaticMethod1(){
System.out.println("InterfaceJava8Test1的静态方法");
}
// 默认方法
public default void getDefaultMethod2(){
System.out.println("InterfaceJava8Test1的默认方法");
}
public default void getDefaultMethod3(){
System.out.println("InterfaceJava8Test1的默认方法2");
}
}
class InterfaceJava8Test2 extends InterfaceJava8Super implements InterfaceJava8Test1{
public void getDefaultMethod2(){
System.out.println("InterfaceJava8Test2的默认方法");
}
}
class InterfaceJava8Super{
// 同名同参数的方法
public void getDefaultMethod3(){
System.out.println("InterfaceJava8Super中的方法");
}
}
in2.getDefaultMethod3(); 输出结果为 :InterfaceJava8Super中的方法
8.如果实现类中实现了多个接口,并且多个接口中有相同的默认方法,而且实现类没有继承父类,或者说父类中没有声明和该接口同名同参数的方法,那么实现类必须重写接口中相同的多个默认方法 (接口冲突)
如下接口 InterfaceJava8Test1和接口InterfaceJava8Test3中有同名同参数的方法,并且InterfaceJava8Test2同时实现了该二个接口,默认情况下接口中的默认方法可以不写,当时同时继承了二个接口,并且该方法相同,再调用的时候不知道调用的是那个接口中的默认方法,所以子类InterfaceJava8Test2必须重写这个方法,然后调用该方法时,得到的将是子类重写的方法
interface InterfaceJava8Test1{
// 静态方法
public static void getStaticMethod1(){
System.out.println("InterfaceJava8Test1的静态方法");
}
// 默认方法
public default void getDefaultMethod2(){
System.out.println("InterfaceJava8Test1的默认方法");
}
public default void getDefaultMethod3(){
System.out.println("InterfaceJava8Test1的默认方法2");
}
}
interface InterfaceJava8Test3{
public default void getDefaultMethod3(){
System.out.println("InterfaceJava8Test1的默认方法2");
}
}
class InterfaceJava8Test2 implements InterfaceJava8Test1,InterfaceJava8Test3{
public void getDefaultMethod2(){
System.out.println("InterfaceJava8Test2的默认方法");
}
@Override
public void getDefaultMethod3()
{
}
}
9.再实现类中怎么得到接口中的原默认方法 格式:接口名.super.默认方法名
interface InterfaceJava8Test1{
// 静态方法
public static void getStaticMethod1(){
System.out.println("InterfaceJava8Test1的静态方法");
}
// 默认方法
public default void getDefaultMethod2(){
System.out.println("InterfaceJava8Test1的默认方法");
}
public default void getDefaultMethod3(){
System.out.println("InterfaceJava8Test1的默认方法2");
}
}
class InterfaceJava8Test2 implements InterfaceJava8Test1{
public void getDefaultMethod2(){
System.out.println("InterfaceJava8Test2的默认方法");
}
public void myMethod(){
InterfaceJava8Test1.super.getDefaultMethod3(); // 得到InterfaceJava8Test1中的getDefaultMethod3方法
}
}