抽象类和接口的异同

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

1、抽象类Abstract Class

  抽象类是关键字abstract修饰的类,既为抽象类,抽象抽象即不能被实例化。而不能被实例化就无用处,因此抽象类只能做为基类(父类),即被继承的类。抽象类中能够包含抽象方法也能够不包含,但具备抽象方法的类必定是抽象类。编程

  抽象类的使用原则以下:编程语言

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

  好比:  ide

 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测试

2、接口Interface

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

  一、接口与类类似点

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

  二、接口与类的区别

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

  三、接口特性

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

  四、接口的继承

  当类实现接口的时候,类要实现接口中全部的方法。不然,类必须声明为抽象的类。类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。.net

  Java中类不容许多继承但接口能够。code

 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 }

3、异同

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

  

相关文章
相关标签/搜索