抽象类和接口是两个非常相似的类型,许多人认为这俩可以互相换着用,他们既有相似的地方,也有不同的地方,本文将带你梳理这些误区,而且用实际代码告诉你抽象类实现接口会多么的有用。
先来熟悉接口与抽象类的区别:
语法层面的区别1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
3)接口中不能含有静态代码块含有静态方法,而抽象类可以有静态代码块和静态方法;
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口
我来解释一些重要的地方
抽象类中可以实现抽象方法和非抽象方法,可以使用所有的修饰符进行修饰,不写修饰符的时候就是包访问权限,而接口只能用public abstract,因为接口中只有类似于抽象方法的方法体,你必须对他进行实现。。。接口是对动作的抽象,抽象类是对根源的抽象。所以在接口中含有静态代码块是不可以的,因为静态代码块中只含有表达式,所以接口是方法的集合体,这违背了他的基本原理,所以是不可以的。而静态方法在jdk1.8之前不可以实现,在jdk1.8之后就可以正常使用了。。。至于为什么这么定义,除了语法设计之外,接口也是一种特殊的类,所以在jdk1.8之后加上了静态方法。抽象类更加的具体,是一种描述的类,所以既可以实现静态代码块也可以实现静态方法。一个类只能继承一个抽象类,而一个类却可以实现多个接口,这个不用多说吧。。接下来开始介绍抽象类实现接口的好处。
先写一个接口
package com.company; /** * ⊙﹏⊙&&&&&&⊙▽⊙ * * @Auther: pangchenbo * @Date: 2019/10/31 10:15 * @Description: */ public interface heihei { int i=0; void heihei1(); void heihei2(); }然后用抽象类实现接口
package com.company; /** * ⊙﹏⊙&&&&&&⊙▽⊙ * * @Auther: pangchenbo * @Date: 2019/10/31 10:14 * @Description: */ public abstract class haha implements heihei { abstract void haha1(); public void heihei1(){ System.out.println("heihei"); } static void hahaha(){ System.out.println("static haha"); } static { int a = 1; } }然后继承抽象类
package com.company; /** * ⊙﹏⊙&&&&&&⊙▽⊙ * * @Auther: pangchenbo * @Date: 2019/10/31 10:19 * @Description: */ public class heiha extends haha { @Override void haha1() { System.out.println("haha1"); } @Override public void heihei2() { System.out.println("heihei2"); } public static void main(String[] args) { heiha heiha = new heiha(); heiha.haha1(); heiha.heihei2(); heiha.heihei1(); System.out.println(i); } }在抽象类中我们实现了heihei1方法,然后你会发现你在heiha类中继承之后只需要实现heihei2方法即可,这就让你在实现类中如果不想实现某些方法,利用抽象类进行实现,就不会出现在最后的实现类中了,是不是很nice?我想是的。哈哈