抽象类和接口的异同
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的选择显得比较随意。具体看下表: