java中的抽象类和接口,及8的接口新特性

JAVA学习网 2017-07-15 14:35:02

自己理解的java语言中的抽象类和接口都是用来表示抽象的一类方法,自己理解的各自特点如下:

  1. 抽象类和抽象方法用abstract表示,如果一个类当中有抽象的方法,这个类一定是抽象的。当然也有抽象的类没有抽象方法的情况也是符合规则的。接口用interface表示,接口里面默认的常量是public final static 默认的方法是public abstract 可以不用写全,系统自动添加。在JDK8以前接口只能使用默认的这种抽象方法。抽象类和接口都不能被实例化。
  2. 抽象类的继承用extends表示,接口的实现用implement表示。注意接口可以使用普通类没有的多继承,也就是说implement可以实现对多接口的实现,当然继承某一类同时实现多接口也是可行的。
  3. 抽象类用于继承类中抽象共同的东西,比如人都要吃饭,不同的人可以吃不同的东西,但是都必须吃饭,吃饭就可以算成一个抽象类,子类继承吃饭,重写吃的各种东西什么的。而接口用于抽象类中不是共同需要东西,比如有些人抽烟,有些人不抽。子类不抽烟的人就不实现这个抽烟接口,抽烟的就实现这个接口重写这个方法,比如抽的什么牌子的烟等等。

下面来说说JDK8里面接口的新特性:

接口不在只能使用抽象的方法了,可以添加具体方法,可以是静态的也可以是非静态的,非静态的方法前面要使用关键字defualt。

静态方法只能被抽口引用,非静态的方法只能被implement类实例化的对象引用。所以当2个接口的静态方法名字相同时,不会存在问题,只能被接口的类名. 引用。而非静态方法就会出现问题,因为对象不知道使用引用哪个接口的方法,就会造成编译失败。

下面用代码演示一下


package 面向对象;
//JDK8的接口新特性。
    interface A
    {
        public abstract void hehe();//传统抽象方法
        public static void haha()//静态方法
        {
            System.out.println("haha");
        }
        public default void lala()
        {
            System.out.println("lala");//非静态要加关键字default
        }
    }

public class Test implements A
{
    public static void main(String[] args)//因为不是抽象的所以可以重写也可以直接使用。
    {
        A.haha();//不能被Test调用
        new Test().lala();//非静态要创建实例使用
    }
    
}

 

 

 

神奇的是有抽象方法存在,子类并没有重写抽象方法,虚拟机没有报错,说明接口是不用写默认的抽象方法的。

 

阅读(787) 评论(0)