接口与抽象类

2016-02-24 16:54:40   最后更新: 2016-05-22 22:08:31   访问数量:375




面向对象的一个重要特征就是抽象,java 中提供了两种抽象的形式,分别是接口和抽象类,虽然他们有很多地方十分相似,但却有着更多的不同,有着各自独特的应用场景

本文就着重介绍一下接口和抽象类

 

抽象方法

abstract void func();

 

 

如上面所示,只有方法声明,没有方法体,并且在方法前添加 abstract 关键字则意味着将这个成员方法创建为抽象方法

 

抽象类

包含抽象方法的类必须在 class 关键字前添加 abstract 关键字,声明他是一个抽象类

 

package com.techlog.test; /** * Created by techlog on 16/2/24. */ abstract public class FirstTest { abstract public void func(); } class BTest { public static void main(String[] argv) { FirstTest firstTest = new FirstTest() { @Override public void func() { System.out.println("abstract func"); } }; } }

 

 

上面的代码创建了一个具有一个抽象方法的抽象类,可以看到,如果想要创建这个抽象类的对象,必须在创建时实现所有的抽象方法

当然了,如果一个类并没有抽象方法,也同样可以将他标记为 abstract 类,这种情况下则意味着这个类只能用于继承,而不能够创建这个类的对象

 

上面我们介绍了抽象方法和抽象类,abstract 关键字允许我们定义没有方法体的抽象方法,而 interface 关键字则让我们构造一个完全抽象的类

接口与类十分相似,但是他没有提供任何具体实现,任何方法都不能具有方法体,换句话说,接口提供了类的形式,但没有提供类的任何具体实现

接口通常用来建立类与类之间的协议

同时,由于 java 要求每个类最多只能继承自一个父类,但可以同时实现很多个接口,因此接口可以实现多继承的特性

另一方面,由于任何类都可以实现任何接口,因此良好的接口定义让我们的代码拥有更高的可复用性

接口中的方法默认是 public 的,同时,在实现一个接口时,接口中定义的方法必须实现为 public 方法,接口中的方法不能声明为 private、protected、friendly 中的任何一个

 

package com.techlog.test; /** * Created by techlog on 16/2/24. */ public interface TestInterface { int A = 0; void func(); }

 

 

上面定义了一个最简单的接口,需要注意的是,接口中的任何成员都是隐式 static 和 final 的,所以必须在定义时初始化,由于这个特点,接口也可以被用作常量的集合,当然,更好地方式是使用 enum 类型

通常,static final 域都使用大写字母的风格,接口中的域自然也使用这一风格

 

作为 java 实现抽象的两个最主要的方式,两者有很多相似的地方,当然也有很多区别

 

语法

最明显的区别体现在语法上:

  1. 抽象类中可以有非 abstract 方法,而接口中则不能(java8 中增添了接口可以有默认方法的新特性,但不能覆盖 equals、hashCode、toString 方法)
  2. 抽象类中的成员变量可以是任何访问权限和任何类型,而接口中的成员变量只能是 public static final 的
  3. 接口中不能含有静态代码块及静态方法,抽象类中没有限制
  4. 一个类只能继承自一个抽象类,但一个类可以实现多个接口

 

设计

设计层面上的区别主要体现在:

抽象类一般是对某种事物的抽象,描述了事物整体的属性和行为,而接口往往是对某个通用行为的抽象

继承通常用来实现“是不是” 的关系,如钢琴是乐器、竖笛是乐器,可以将乐器设计为一个抽象类,钢琴、竖笛则是“乐器”抽象类的子类

而接口的实现通常用来体现“有没有”的关系,比如鸟会飞,飞机会飞,云会飞,但是他们并没有继承关系,可以创建一个接口,这个接口具有“飞”的成员方法,鸟、飞机、云都实现这个接口,从而具有“飞”的行为

 

从设计层面上看,抽象类作为其他类的父类,是一种模板式设计,而接口则是一种行为规范,是一种辐射式设计

抽象类体现的是共性,一旦这些共性的东西需要更新,则只需要更新抽象类

接口则体现的是差异性,上例中,鸟、飞机、云都会飞,但飞的行为各有不同,如果需要更新,则需要更改每个实现

 






技术帖      龙潭书斋      class      java      接口      interface      thinking in java      final      java编程思想      static     


京ICP备15018585号