Java中接口和抽象类的区别你真的清楚吗?
2015-09-15 10:06
633 查看
一、引言
Java中抽象类和接口的区别你的真的全部知道吗?今天看见一片CSDN首页博文,感觉他总结的不是很好,于是自己亲自总结一下,结果发现很多意想不到的情况。那么先列一列总结出来的区别吧,这些你都知道吗?:
(1)抽象类单继承、接口多实现
(2)接口的所有成员变量都必须是public(默认会加上public static),抽象类抽象方法必须是public,其他随意
(2)对方法来说:
接口中的方法都需要是抽象的,不能用private修饰,其方法不需要手动加上abstract
抽象类的方法不一定是抽象的,抽象方法需要手动添加abstract修饰符,抽象类可以有私有非抽象方法。
(3)就实例化来说:抽象类和接口都可以通过new的方式得到实例,不过都属于Anonymous InnerType类型
(4)对于属性来说:接口只能包含初始化过的属性,抽象类随意。
(5)对于常量来说:接口和抽象类都可以包含常量,只是接口必须是public而已
(6)对于继承和实现来说:抽象类可以继承其他类,可以实现其他接口;接口可以多继承其他接口(震惊!!!)
二、用代码说话
(1)首先定义一个抽象类,代码如下,本人用注释写了其特性:
(2)再定义一个接口,代码如下:
(3)定义一个Main类,验证其能否被new出来,代码如下(如果实践,请先把上面报错的代码注释):
三、小结
上面是本人总结的几条规则,其实更应该从Java设计方面去思考,为什么抽象类和接口有这些区别。这样就脱离的死记硬背了。
如有错漏之处,请留言指出!
Java中抽象类和接口的区别你的真的全部知道吗?今天看见一片CSDN首页博文,感觉他总结的不是很好,于是自己亲自总结一下,结果发现很多意想不到的情况。那么先列一列总结出来的区别吧,这些你都知道吗?:
(1)抽象类单继承、接口多实现
(2)接口的所有成员变量都必须是public(默认会加上public static),抽象类抽象方法必须是public,其他随意
(2)对方法来说:
接口中的方法都需要是抽象的,不能用private修饰,其方法不需要手动加上abstract
抽象类的方法不一定是抽象的,抽象方法需要手动添加abstract修饰符,抽象类可以有私有非抽象方法。
(3)就实例化来说:抽象类和接口都可以通过new的方式得到实例,不过都属于Anonymous InnerType类型
(4)对于属性来说:接口只能包含初始化过的属性,抽象类随意。
(5)对于常量来说:接口和抽象类都可以包含常量,只是接口必须是public而已
(6)对于继承和实现来说:抽象类可以继承其他类,可以实现其他接口;接口可以多继承其他接口(震惊!!!)
二、用代码说话
(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(){}; }
(2)再定义一个接口,代码如下:
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设计方面去思考,为什么抽象类和接口有这些区别。这样就脱离的死记硬背了。
如有错漏之处,请留言指出!
相关文章推荐
- Mac下添加java环境变量
- Spring MVC Exception Handling Example
- java mail 发邮件完整实现
- struts2升级jar包遇到无法正常访问action的方法的问题
- javaweb学习笔记
- 【Java】PrettyTime
- Spring 3 MVC ContentNegotiatingViewResolver example
- spring cache 详解
- Maven项目下update maven后Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderL
- [转]spring 注入静态变量
- eclipse下java.lang.OutOfMemoryError:Java heap space
- Spring MVC + Log4j example
- 一个简答的java死锁
- javac不是内部命名
- 20个非常有用的Java程序片段
- Java关键字final、static使用总结
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- Spring面试问答Top 25
- JavaMail邮件发送-发送一个文本邮件和一些问题说明
- Eclipse中把项目转成web项目