07 接口和抽象类

简介: 接口比抽象类更加抽象的是接口,在接口中所有的方法都会被 public abstract 修饰。注意:Java 8 之后接口中新增加了 default 默认方法和 对 static 方法的支持。• Java 中不支持多继承,而是通过接口实现比多重继承更强的功能,java 通过接口可以使出于不同层次,甚至不相关的类具有相同的行为.• 接口可以认为是特殊的抽象类, 不能用于直接创建对象。接口的作用在于规定一些功能框架,具体功能的实现则通过该接口约束的类完成。

接口



比抽象类更加抽象的是接口,在接口中所有的方法都会被 publicabstract 修饰。


注意:Java 8 之后接口中新增加了 default 默认方法和 对 static 方法的支持。


  • Java 中不支持多继承,而是通过接口实现比多重继承更强的功能,java 通过接口可以使出于不同层次,甚至不相关的类具有相同的行为.


  • 接口可以认为是特殊的抽象类, 不能用于直接创建对象。接口的作用在于规定一些功能框架,具体功能的实现则通过该接口约束的类完成。


接口的定义:一般由常量和抽象方法组成

[public] interface 接口名 [extends 父接口名列表 ]  {                 
    [public] [static] [final] 域类型 域名 = 常量值 ;                 
    [public] [abstract] 返回值 方法名(参数列表) [throw 异常列表];           
 }


  1. 声明接口可给出访问控制符;


  1. 接口的继承同样使用 extends 关键字,多个父接口之间以逗号分隔。


  1. 系统默认接口中所有属性的修饰都是 public static final, 为全局常量.


  1. 系统默认接口中所有方法的修饰都是 public abstract; 即抽象方法.


  1. 与类一样,接口也可以使用 instanceof 关键字,用来判断一个对象是否实现了某接口。


接口的实现


  • 定义了一套行为规范,一个类实现这个接口就是要遵守接口的定义规范,要实现接口中定义的所有方法.


  • 一个类可以实现多个接口。接口间用逗号分隔;


  • 如果实现某接口的类不是抽象类,则在类的定义部分必须实现指定接口的所有抽象方法;否则编译时会指示该类只能为抽象类是不能创建对象的.


  • 接口的抽象方法的访问限制符默认为 public


Java 8 新特性默认方法和静态方法


Java 8在接口中提供了声明默认方法和静态方法的能力。接口示例代码如下:

package xxx.yyy;
public interface IHello {
    public static void xxx() {      
        System.out.println("xxx");
    }
    public default void yyy() {     
        System.out.println("yyy");
    }
}


注意:在 Java 8 中,静态方法和默认方法都必须是 public 的,Java 9 去除了这个限制,它们都可以是private的,引入 private方法主要是为了方便多个静态或默认方法复用代码。


抽象类



引入抽象方法和抽象类,是 Java 提供的一种语法工具,对于一些类和方法,引导使用者正确使用它们,减少误用。使用抽象方法而非空方法体,子类就知道它必须要实现该方法,而不可能忽略,若忽略Java编译器会提示错误。使用抽象类,类的使用者创建对象的时候,就知道必须要使用某个具体子类,而不可能误用不完整的父类。


抽象类声明和实现


在Java中抽象类和抽象方法的修饰符是 abstract,注意抽象方法中只有方法的声明,没有方法的实现。


  • 抽象类不能被实例化,只有具体类才能被实例化;


  • 抽象类可以拥有默认的构造函数, 供子类实例化调用, 用于完成子类构建对象的一些公共任务;


  • 抽象类中可以包含具体方法和抽象方法;


  • 非抽象类(具体类) 若继承抽象类必须重写所有抽象方法。

abstract class 类名称 {           
    member var;  
    method(){…}        // 一般方法
    abstract method();  // 抽象方法, 抽象方法在后直接跟分号          
  }


普通类加上 abstract 关键字就变成了抽象类。一但类中包含有抽象方法的类必须定义为抽象类或者接口,否则编译时会提示 The type XXX must be an abstract class to define abstract methods


Q: 抽象关键字 abstract 不可以和哪些关键字共存?  

   

A: private  私有内容子类继承不到,所以,不能重写. 但是,abstract修饰的方法,要求被重写。两者冲突。


final   final 修饰的方法不能被重写。而 abstract 修饰的方法,要求被重写。两者冲突。


static 假如一个抽象方法能通过 static 修饰,那么这个方法,就可以直接通过类名调用。而抽象方法是没有方法体的,这样的调用无意义。所以,不能用 static 修饰。


抽象类和接口是配合而非替代关系,它们经常一起使用,接口声明能力,抽象类提供默认实现,实现全部或部分方法,一个接口经常有一个对应的抽象类。比如,在 Java 类库中,有:


❑ Collection 接口和对应的 AbstractCollection 抽象类。


❑ List 接口和对应的 AbstractList 抽象类。


❑ Map 接口和对应的 AbstractMap 抽象类。


参考


  • 丁振凡编著,《Java 语言程序设计(第2版)》华东交大版,2014.9




目录
相关文章
|
7月前
|
Java
抽象类和接口有什么区别?
抽象类和接口有什么区别?
|
2月前
|
Java 编译器
关于抽象类和接口(详解)
关于抽象类和接口(详解)
43 6
|
2月前
|
程序员 C++
抽象类与接口
抽象类与接口
36 0
|
7月前
|
C++
c++接口(抽象类)
c++接口(抽象类)
66 1
|
7月前
|
Java 编译器
抽象类和接口
抽象类和接口
C++中的抽象类和接口
C++中的抽象类和接口
94 0
抽象类与接口
抽象类 abstract修饰符可以用来修饰方法,也可以用来修饰类,修饰方法就是抽象方法,修饰类就是抽象类 抽象类中可以没有抽象方法,但是抽象方法的类一定要声明为抽象类 抽象类,不能使用new关键字来创建对象,它使用来让子类继承的 抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的 子类继
|
存储 API
使用抽象类和接口的优解
使用抽象类和接口的优解   1. 前言 2. 所谓习惯认知 3. 开门见山的万金油 第1条:抽象类设计注重对象性,接口设计注重服务性 第2条:更近的抽象类,更远的接口 第3条:子类间有关系时考虑用抽象类,没有关系时一定要用接口 第4条:版本迭代中优先考虑使用抽象类而不是接口 4. 设计是个性的妥协 5. 参考资料 1. 前言 笔者相信,每个使用面向对象语言的开发者自编码以来,肯定便琢磨过抽象类(Abstract)和接口(Interface)的区别。
875 1