抽象类与接口
2016-03-12 10:51
274 查看
1 抽象类和抽象方法
abstract关键字允许在类中创建一个或多个没有任何定义的方法即只声明了方法却没有提供方法体如abstract void f(),这些实现是由此类的继承者创建的。包含抽象方法的类叫做抽象类,如果一个类包含一个或者多个抽象方法,该类必须被限定为抽象的。我们也可以定义一个没有任何抽象方法的抽象类。某个类称为抽象类,不需要所有的方法都是抽象的。
切记:不允许创建抽象类的对象。
2 接口
在接口中的每一个方法都只是一个声明,这是编译器所允许的在接口中唯一能够存在的事务,此外,在接口中没有任何方法被声明是public的,但是它们自动都是public abstract的,而且接口中的方法只能被这两个关键字修饰,在使用的时候加不加关键字都自动是public abstract的。接口也可以包含域,但是这些域隐式地是public 、static和final的。接口中定义的域不可以是“空final”的,但是可以被非常量表达式初始化。如
Public interface test{ Random rand = new Random(47); int RANDOM_INT = rand.nextInt(10); }
使用接口的原因:①为了能够向上转型为多个基类型,以及由此带来的灵活性;
②防止客户端程序员创建该类的对象,并确保这仅仅是建立一个接口。
3 为什么java中有些接口没有任何方法
在java语言中,有些接口内部没有声明任何方法,也就是说,实现这些接口的类不需要重写任何方法,这些没有任何方法声明的接口又被叫做标识接口。标识接口对实现它的类没有任何语义上的要求,它仅仅充当一个标识的作用,用来表明实现它的类属于一个特定的类型。4 抽象类与接口的相同点
1) 都不能被实例化;2) 接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才可以被实例化。
5 抽象类与接口的不同点
从写一个类的过程来看。1)接口可以继承接口,抽象类既可以实现接口也可以继承具体类;
2) 接口中的成员变量是public static final,所以必须给其赋初值,所有的成员方法都是public 、static的,而且只能被这两个关键字修饰。而抽象类可以有自己的数据成员变量,也可以有抽象的成员方法,抽象类中的成员变量和普通类的成员变量一样的四种修饰符,抽象类的抽象方法由于要被继承的子类实现,因此不能被private、static、synchronized、native等访问修饰符修饰,同时必须以分号结尾,并且不能带有花括号。所以,当功能需要被积累时用抽象类;不需要积累时用接口。
3)接口中的方法只有定义不能实现,而抽象类中的方法可以有定义与实现;
4)接口不可以有静态的public static void main(String[] args){}方法,抽象类可以有。
5)接口是被实现,而抽象类只能被继承。一个类可以实现多个接口,但是只可以继承一个抽象类,因此使用接口可以间接地达到多重继承的目的;
6)接口强调的特定功能的实现,其设计理念是“has-a”的关系,而抽象类强调所属关系,是“is-a”的关系;
7)接口被用于实现比较常用的功能,便于日后维护或者添加删除方法;而抽象类更倾向于充当公共类的角色,不适用于日后重新对里面的代码进行修改。
总之,接口是一种特殊形式抽象类,使用接口完全由可能实现与抽象类相同的操作,但一般而言,抽象类多用于在同类事物中有无法具体描述的方法的场景,所以当子类和父类之间存在逻辑上的层次结构时,推荐使用抽象类;而接口多用于不同类之间,定义不同类之间的通信规则,所以当希望支持差别较大的两个或者更多对象之间的特定交互行为时,应该使用接口。
相关文章推荐
- C语言—指针数组
- 四则运算2
- Ruby SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B:
- Qt 连接Mysql win10
- QML中的TextEdit和TextArea的区别
- unity提示消息窗口
- 嵌入式linux:嵌入式Linux中让应用程序自动启动
- xml中的特殊符号
- Android jni学习
- JQuery随心笔记----jquery操作select
- How to send patch to Linux upstream
- cocos2d-x避免手动修改android.mk文件来编译
- 笔试题及答案
- 切换Fragment时避免重复加载UI
- 对软件工程的认识
- C/C++函数指针(typedef简化定义)
- 安装vim
- 提取混乱字符串
- QML行编辑器TextField
- Nginx 单IP绑定多域名配置 顶级域名重定向到www域名