抽象类和接口的异同

   Java中的两种抽象定义:一为抽象类(Abstract Class),二为接口(Interface)。

一、抽象类Abstract Class

  抽象类是关键字abstract修饰的类,既为抽象类,抽象抽象即不能被实例化。而不能被实例化就无用处,所以抽象类只能作为基类(父类),即被继承的类。抽象类中可以包含抽象方法也可以不包含,但具有抽象方法的类一定是抽象类。

  抽象类的使用原则如下:

  • (1)被继承性抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public
  • (2)抽象性抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理;
  • (3)抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类;
  • (4)子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

  比如:  

 1 package com.fzz.test;
 2 
 3 //抽象类A
 4 abstract class A{
 5     public void fun(){//普通方法
 6         System.out.println("存在方法体的方法");
 7     }
 8 
 9     public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
10 
11 }
12 //单继承特性
13 class B extends A{//B类是抽象类的子类,是一个普通类
14     @Override
15     public void print() {//强制要求重写
16         System.out.println("Why is more important than what!");
17     }
18 
19 }
20 //测试类
21 public class TestDemo {
22     public static void main(String[] args) {
23         A a = new B();//多态:向上转型
24         a.fun();//被子类所覆写的过的方法
25     }
26 }

  详细可参考:https://blog.csdn.net/wei_zhi/article/details/52736350

二、接口Interface

  在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

  1、接口与类相似点

  • 一个接口可以有多个方法。
  • 接口文件保存在 .java 结尾的文件中,文件名使用接口名。
  • 接口的字节码文件保存在 .class 结尾的文件中。
  • 接口相应的字节码文件必须在与包名称相匹配的目录结构中。

  2、接口与类的区别

  • 接口不能用于实例化对象。
  • 接口没有构造方法。
  • 接口中所有的方法必须是抽象方法。
  • 接口不能包含成员变量,除了 static 和 final 变量。
  • 接口不是被类继承了,而是要被类实现。
  • 接口支持多继承。

  3、接口特性

  • 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
  • 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
  • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

  4、接口的继承

  当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。

  Java中类不允许多继承但接口可以。

 1 // 文件名: Sports.java
 2 public interface Sports
 3 {
 4    public void setHomeTeam(String name);
 5    public void setVisitingTeam(String name);
 6 }
 7  
 8 // 文件名: Football.java
 9 public interface Football extends Sports
10 {
11    public void homeTeamScored(int points);
12    public void visitingTeamScored(int points);
13    public void endOfQuarter(int quarter);
14 }
15  
16 // 文件名: Hockey.java
17 public interface Hockey extends Sports
18 {
19    public void homeGoalScored();
20    public void visitingGoalScored();
21    public void endOfPeriod(int period);
22    public void overtimePeriod(int ot);
23 }

三、异同

  abstract class和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。具体看下表:

  

posted @ 2018-04-30 21:33  风之之  阅读(6837)  评论(0编辑  收藏  举报