一、引言
Java中抽象类和接口的区别你的真的全部知道吗?今天看见一片CSDN首页博文,感觉他总结的不是很好,于是自己亲自总结一下,结果发现很多意想不到的情况。那么先列一列总结出来的区别吧,这些你都知道吗?:
(1)抽象类单继承、接口多实现
(2)接口的所有成员变量都必须是public(默认会加上public static),抽象类抽象方法必须是public,其他随意
(2)对方法来说:
接口中的方法都需要是抽象的,不能用private修饰,其方法不需要手动加上abstract
抽象类的方法不一定是抽象的,抽象方法需要手动添加abstract修饰符,抽象类可以有私有非抽象方法。
(3)就实例化来说:抽象类和接口都可以通过new的方式得到实例,不过都属于Anonymous InnerType类型
(4)对于属性来说:接口只能包含初始化过的属性,抽象类随意。
(5)对于常量来说:接口和抽象类都可以包含常量,只是接口必须是public而已
(6)对于继承和实现来说:抽象类可以继承其他类,可以实现其他接口;接口可以多继承其他接口(震惊!!!),多继承代码如下:
//接口可以多继承
public interface tet1 extends DialogInterface.OnClickListener, DialogInterface.OnCancelListener {
}
二、用代码说话
(1)首先定义一个抽象类,代码如下,本人用注释写了其特性:
//可以看到抽象类既可以继承,也可以实现其他接口
public abstract class Test_abstract extends Money implements Test2_interface {
//可以包含初始化的属性,公有私有都可以
public int a=5;
private int a2=6;
//可以包含没有初始化的属性,共有私有都可以
public int b;
private int c;
//可以包含常量,这个必须初始化,共有私有都可以
public final int d=7;
private final int e=6;
//可以包含抽象方法,这个是基本属性,不能用private修饰
abstract int method();
public abstract void m();
//可以包含非抽象方法,共有私有都可以
private void youtu(){};
public void jiujiu(){};
}
public interface Test_interface extends Test2_interface {
//可以包含初始化的属性,只能是public
public int a=5;
private int a2=6; //出错
//不能包含没有初始化的属性
public int b; //出错
//可以包含常量,这个必须初始化,只能是public
public final int d=7;
private final int e=6; //出错
//可以包含抽象方法,这个是基本属性,不能用private修饰,可以不手动加abstract修饰符
int method();
public abstract void m();
//不能包含非抽象方法
private void youtu(){}; //出错
public void jiujiu(){}; //出错
}
(3)定义一个Main类,验证其能否被new出来,代码如下(如果实践,请先把上面报错的代码注释):
public class Main {
public static void main(String[] args) throws Exception {
//new了一个抽象类 Anonymous InnerType
Test_abstract m=new Test_abstract() {
@Override
int method() {
//匿名的类可以用this访问公有的任何成员
this.a=1;
return 0;
}
@Override
public void m() {
}
};
//new了一个接口 Anonymous InnerType
Test_interface x= new Test_interface() {
@Override
public int method() {
//匿名的类可以用this访问公有的任何成员
int x=this.d;
return 0;
}
@Override
public void m() {
}
};
}
}
三、小结
上面是本人总结的几条规则,其实更应该从Java设计方面去思考,为什么抽象类和接口有这些区别。这样就脱离的死记硬背了。
如有错漏之处,请留言指出!