自己理解的java语言中的抽象类和接口都是用来表示抽象的一类方法,自己理解的各自特点如下:
- 抽象类和抽象方法用abstract表示,如果一个类当中有抽象的方法,这个类一定是抽象的。当然也有抽象的类没有抽象方法的情况也是符合规则的。接口用interface表示,接口里面默认的常量是public final static 默认的方法是public abstract 可以不用写全,系统自动添加。在JDK8以前接口只能使用默认的这种抽象方法。抽象类和接口都不能被实例化。
- 抽象类的继承用extends表示,接口的实现用implement表示。注意接口可以使用普通类没有的多继承,也就是说implement可以实现对多接口的实现,当然继承某一类同时实现多接口也是可行的。
- 抽象类用于继承类中抽象共同的东西,比如人都要吃饭,不同的人可以吃不同的东西,但是都必须吃饭,吃饭就可以算成一个抽象类,子类继承吃饭,重写吃的各种东西什么的。而接口用于抽象类中不是共同需要东西,比如有些人抽烟,有些人不抽。子类不抽烟的人就不实现这个抽烟接口,抽烟的就实现这个接口重写这个方法,比如抽的什么牌子的烟等等。
下面来说说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();//非静态要创建实例使用 } }
神奇的是有抽象方法存在,子类并没有重写抽象方法,虚拟机没有报错,说明接口是不用写默认的抽象方法的。