理解性记忆抽象类和接口的区别
抽象类和接口的区别是面试和平时常见到的一个问题,这里主要可以从两个方面去看他们的区别,首先是在语法上的区别
很多小白(包括我)在刚开始去看接口和抽象类时总是去死记硬背他们的区别,但是其实可以从另一个角度去看
首先抽象类,无论如何,它也算是一个类,所以可以罗列以下几点
1.既然是类,那么它就会有构造函数,而反观接口,则没有自己的构造函数,
2.再从成员方法去看,一个类即可以有抽象方法和非抽象方法,但是接口只能有抽象方法,无论你是否写出方法的修饰符,接口中方法的修饰符默认都是
public abstract,并且你不能尝试去修改
3.从成员变量来看,类可以有静态和非静态变量,但是接口只能有静态成员变量
4.从修饰符来看,抽象类的修饰符我们可以自己选择,但是接口中的默认修饰符总是public static,无论你是否写出来
就是图中灰色的地方,无论你是否写出来,都会存在,并且你不能尝试去修改它的默认修饰符
那么以上是语法上的区别,那么为什么java中允许多实现但是不允许多继承呢?这也是下面要说的应用上的区别
如果你现在有class A{
void fun(){
system.out.print(“a”);
}
class B{
void fun(){
system.out.print(“b”);
}
class C extend A,B(这里是不允许这样写的,只是为了给大家演示为何不能多继承{
void fun()
{
system.out.print(“a”);
}
void fun(){
system.out.print(“b”);
}
}
如果java允许这样写的话,那么问题来了,当你使用c的实例去调用fun()方法的时候,怎么知道你调用的是哪一个呢?这也就是java不允许多继承的原因,那么为什么能多实现呢?
public interface aa {
void fun();
}
public interface kk {
public static final int a=10;
public abstract void fun();
}
public calss C implements aa,kk{
void fun(){}
}
这里就不会出现上面多继承出现的问题,因为接口里的方法都没有具体的实现,所以你去实现这两个接口时,只会让你实现一个fun()方法,因此可以使用多实现来减少代码的复杂性
第一次写博客,有不足或者知识点有错会虚心接受,欢迎补充
本文地址:https://blog.csdn.net/qq_43716944/article/details/109860628
上一篇: SQL中的三种去重方法小结