接口中的方法可以有方法体了?静态方法可以写在接口中?来看Java1.8新特性!

对于接口我们都很熟悉,关于接口的的特性我们也是耳熟能详

  • 接口中的属性默认使用public static final 修饰
  • 接口中的方法默认使用public abstract 修饰
  • 接口可以多继承

但是在java8中,由于Lamada表达式的出现,接口这一类出现了巨大的变化

首先由于Lamada表达式的出现,一些接口中多出了很多要适应它的方法,这样就会导致从前实现这些接口的实现类都需要重写,为了更加方便的解决这一问题,java8在接口中添加了default修饰的默认方法。这个方法的声明方式如下:

  public interface Note{

    public abstract void print();

    default void dprint(){
        System.out.println("接口中的默认方法");
    }

}

注意:由于这个方法时普通方法,所以不能加abstarct修饰

这个方法默认存在接口中,实现类可以不必重写,当使用接口的对象调用的时候,会直接调用接口中的这个方法

public class Realize implements Note {

    @Override
    public void print() {
        System.out.println("实现类中的方法");
    }

}
public class Test {

    public static void main(String[] args) {
        Note n = new Realize();       
        n.print();//会输出实现类的方法
        n.dprint();//会输出接口中的方法
    }
}

 运行结果:

实现类中的方法
接口中的默认方法

default修饰的默认方法重写和其他抽象方法重写的方式相同

public class Realize implements Note {

    @Override
    public void print() {
        System.out.println("实现类中的方法");
    }

    @Override
    public void dprint(){
        System.out.println("实现类中重写的默认方法");
    }

}

继续运行Test.main()方法,结果为:

实现类中的方法
实现类中重写的默认方法

同时,java8中,接口中也可以定义静态方法

public interface Note{

    static void method(){
        System.out.println("接口中的静态方法");
    }

    public abstract void print();

    default void dprint(){
        System.out.println("接口中的默认方法");
    }
}

但是静态方法的重写是无意义的,这一点就不必赘述了

即使实现类中重写了接口的静态方法,当接口对象指向实现类时,接口对象调用的仍然是自己的静态方法,而不是实现类的

无法构成多态的重写,也就没有必要重写了

 


public class Realize implements Note {

    @Override
    public void print() {
        System.out.println("实现类中的方法");
    }

//    @Override    //写与接口同名的静态方法,编译器不认为是重写,加Override注解报错
    public static void method(){
        System.out.println("123");

    }

    @Override
    public void dprint(){
        System.out.println("实现类中重写的默认方法");
    }
}
public class Test {

    public static void main(String[] args) {

        Note n = new Realize();
        //接口指向实现类,与父引用指向子类类似
        n.print();//会输出实现类的方法
        //接口中的静态方法,可以直接通过接口调用
        Note.method();
        n.dprint();
    }
}

结果为:

实现类中的方法
接口中的静态方法
实现类中重写的默认方法

注意: 写与接口同名的静态方法,编译器不认为是重写,加Override注解报错。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章