Java 接口和抽象类的区别和使用
2016-03-20 13:45
711 查看
接口和抽象类都可以归类为Java类编写的辅助工具,没有接口和抽象类,类的编写会变得更加繁琐。
接口(interface)可以称为抽象类(abstract class)的一个变种。接口是对类的动作进行抽象,而抽象类是对若干类的公共特征进行抽象。一个简单的例子,一句话代表一个实体类,接口就是对一句话中的动词进行抽象,定义了一个动词,让每一个具体使用此动词的话赋予含义。而抽象类就像一句模版话,实体类从模版继承而来,将自己的特殊性写好即可完成。
接口中的所有属性都应该是static 的,而抽象类中没有此限制。
接口中的所有的方法都是抽象的,实现此接口的类要重写接口中定义的所有的方法。
抽象类中的方法可以是实体已经实现的方法,也可以是抽象方法,在子类继承了抽象的时候,子类可以重写抽象类中已经实现了的方法,也可以不重写,但是要重写抽象类中定义的抽象方法,如果不想进行重写,那么将子类再次定义成抽象类让继承此子类的类进行重写。
类之间是单继承的关系,类和接口之间是实现关系,一个类可以实现多个接口,但是只能继承一个类,抽象类同样此规则。
接口之间可以实现多继承关系,即Interface a extends b,c。java允许b和c有相同的方法名称,因为接口中只有方法定义,实现是从具体类中书写的,那么实现a接口的类需要实现a,b,c所定义的最大公约方法,对于其中定义的重复名称的方法只需要实现一次即可。
在使用上,接口是对动作进行定义,关注的是一组实现此接口的类的公共操作。使用比较简单。抽象类是对一组类的公共特征进行整体抽象,从一组类中提取出来的信息抽象到抽象类中必须是这一组类的共有属性,使用起来比接口复杂一些。
//多接口事例//Animals.java
//抽象类事例
//Biology.java
接口(interface)可以称为抽象类(abstract class)的一个变种。接口是对类的动作进行抽象,而抽象类是对若干类的公共特征进行抽象。一个简单的例子,一句话代表一个实体类,接口就是对一句话中的动词进行抽象,定义了一个动词,让每一个具体使用此动词的话赋予含义。而抽象类就像一句模版话,实体类从模版继承而来,将自己的特殊性写好即可完成。
接口中的所有属性都应该是static 的,而抽象类中没有此限制。
接口中的所有的方法都是抽象的,实现此接口的类要重写接口中定义的所有的方法。
抽象类中的方法可以是实体已经实现的方法,也可以是抽象方法,在子类继承了抽象的时候,子类可以重写抽象类中已经实现了的方法,也可以不重写,但是要重写抽象类中定义的抽象方法,如果不想进行重写,那么将子类再次定义成抽象类让继承此子类的类进行重写。
类之间是单继承的关系,类和接口之间是实现关系,一个类可以实现多个接口,但是只能继承一个类,抽象类同样此规则。
接口之间可以实现多继承关系,即Interface a extends b,c。java允许b和c有相同的方法名称,因为接口中只有方法定义,实现是从具体类中书写的,那么实现a接口的类需要实现a,b,c所定义的最大公约方法,对于其中定义的重复名称的方法只需要实现一次即可。
在使用上,接口是对动作进行定义,关注的是一组实现此接口的类的公共操作。使用比较简单。抽象类是对一组类的公共特征进行整体抽象,从一组类中提取出来的信息抽象到抽象类中必须是这一组类的共有属性,使用起来比接口复杂一些。
//多接口事例//Animals.java
public interface Animals { public void eat(); public void sleep(); public void move(); }//Plants.java
public interface Plants { public void grow(); public void sleep(); }//Biology.java
public interface Biology extends Animals,Plants { //接口允许多继承 public void reproduce (); }
//NewSpecies.java
public class NewSpecies implements Biology,Animals{ //实现多个接口的类要实现其定义的所有方法 @Override public void eat() { System.out.println("Animals中的eat方法"); } @Override public void sleep() { System.out.println("Animals中的sleep方法"); }@Override public void move() { System.out.println("Animals中的move方法"); } @Override public void grow() { System.out.println("Biology中继承Plants的grow方法"); }@Override public void reproduce() { System.out.println("Biology中的reproduce方法"); } public static void main(String[] args) { NewSpecies species = new NewSpecies(); species.move(); } }
//抽象类事例
//Biology.java
<pre name="code" class="java"><pre name="code" class="java">public abstract class Biology { public abstract void eat(); public abstract void sleep(); public void move() { System.out.println("biology_move"); } public void grow() { System.out.println("biology_grow"); } public void reproduce() { System.out.println("biology_reproduce"); } }//Animals.java
public abstract class Animals extends Biology{ //抽象类可以实现父类的部分方法 <span style="white-space:pre"> </span>@Override <span style="white-space:pre"> </span>public void eat() { <span style="white-space:pre"> </span>System.out.println("animals_eat"); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>@Override <span style="white-space:pre"> </span>public void move() { <span style="white-space:pre"> </span>System.out.println("animals_move"); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>public abstract void say(); }//NewSpecies.java
public class NewSpecies extends Animals{ //实体类必须实现父类所有的抽象方法,根据实际情况重写部分方法 @Override public void say() { System.out.println("newspecies_say"); } @Override public void sleep() { System.out.println("newspecies_sleep"); } @Override public void move() { System.out.println("newspecies_move"); } @Override public void grow() { System.out.println("newspecies_grow"); } public static void main(String[] args) { NewSpecies species = new NewSpecies(); species.eat(); species.grow(); species.move(); species.reproduce(); species.say(); species.sleep(); } }//输出结果
//animals_eat //newspecies_grow //newspecies_move //biology_reproduce //newspecies_say //newspecies_sleep
相关文章推荐
- Spring框架基础示例
- java第八节-多态,抽象类,接口
- Java基础之二:Java语法基础
- RMI介绍与使用
- JAVA CAS单点登录之一:搭建CAS服务器
- As a good Java programer
- Java Executor并发框架(三)ThreadPoolExecutor 队列缓存策略
- Eclipse juno 中安装 JBoss Tools,集成Hibernate
- java 抽象类 抽象方法被调用 static 方法不能被复写
- java 认识异常
- JAVA 集合
- hbm2java和hbm2ddl的使用步骤
- 20145216史婧瑶《Java程序设计》第3周学习总结
- spring mvc 400 Required String parameter 'quizId' is not present 前端参数找不到
- java画板总结
- Java开发环境搭建
- 《java学习的一些概念》
- [排序算法]——冒泡排序
- 输入/输出(一)——编码,文件类,随机读写文件类
- hibernate和spring整合时出现的数据库连接问题