抽象类和接口是两个非常相似的类型,许多人认为这俩可以互相换着用,他们既有相似的地方,也有不同的地方,本文将带你梳理这些误区,而且用实际代码告诉你抽象类实现接口会多么的有用。
先来熟悉接口与抽象类的区别:
- 语法层面的区别
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?我想是的。哈哈