天天看点

抽象类与接口1. 抽象类2. 接口3. 关系总结4. 抽象类和接口的区别

1. 抽象类

1.1 概念

首先,抽象类就是一个不具体的类。 随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没 有具体的实例,这样的类叫做抽象类。 

在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。

1.2 抽象类特点

1.2.1 抽象类和抽象方法必须要用abstract关键字修饰:

抽象类默认的修饰符是:public abstract 

抽象方法的默认修饰符是:pubic abstract 

抽象类里面属性默认修饰符是:public static final

  • public abstract class ClassName{}
  • public abstract void Method();
  • public static final int PI = 3.14;

1.2.2 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类。

1.2.3 抽象类的子类要么是抽象类,要么实现所有的抽象方法。

1.2.4 抽象类可以继承,但不能被实例化,只能由具体的子类实例化(属于多态的一种,抽象类多态)。

1.2.5 抽象类与final类相反,final类不可以继承,可以实例化。

1.3 抽象类的成员特点

1.3.1 抽象类的成员变量可以是常量,也可以是变量。

1.3.2 抽象类虽然不能实例化,但它有构造方法(所有类都有构造方法),其构造方法的主要用于子类访问父类数据的初始化。

1.3.3 成员方法可以有抽象方法,先定子类必须实现;也可以有非抽象方法,提高代码的复用性。

1.4 抽象类与普通类

相同点: 

  • 抽象类和一般类都是用来描述事物的,都在内部定了成员。 

不同: 

  • 一般类有足够的信息描述事物;抽象类描述事物的信息有可能不足。 
  • 一般类中不能定义抽象方法,只能定非抽象方法;抽象类中可定义抽象方法,同时也 可以定义非抽象方法。
  • 一般类可以被实例化;抽象类不可以被实例化。 

注意: 

  • 不能用 abstract 修饰属性、私有方法、构造器、静态方法、final 的方法 

2. 接口

2.1 概念

接口(interface)是抽象方法和常量值的定义的集合。

从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。

2.2 接口的特点

2.2.1 接口用关键字interface表示,interface 接口名 {} 

2.2.2 类实现接口用implements表示,class 类名 implements 接口名 {} 

2.2.3 接口没有构造方法,不能实例化。按照多态的方式,由具体的实现类实例化。(接口多态)

2.2.4 接口的子类要么是抽象类要么重写接口中的所有方法。

2.2.5 接口之间可以相互继承,并且支持多继承。

2.2.6 接口中的所有成员变量都默认是由 public static final 修饰的(固定的)。 

2.2.7 接口中的所有方法都默认是由 public abstract 修饰的(固定的)。

2.2.8 由以上两点可知:接口中的成员都是公共的权限 

2.3 接口成员特点

2.3.1 成员变量:只能是常量 ,默认修饰符 public static final。

2.3.2 构造方法:没有构造方法,因为接口主要是扩展功能的,而没有具体存在。

2.3.3 成员方法:只能是抽象方法,默认修饰符 public abstract。

3. 关系总结

类与类:继承关系,只能单继承,但是可以多层继承。

类与接口:实现关系,可以单实现,也可以多实现。还可以在继承类的同时实现一个或多个接口。

接口与接口:继承关系,可以单继承,也可以多继承。

4. 抽象类和接口的区别

4.1 成员区别

抽象类:包含变量,常量,抽象方法,非抽象方法。

接口:包含常量,抽象方法。

4.2 关系区别

类与类:继承,单继承。

类与接口:实现,支持多实现。

接口与接口:继承,支持多继承。

4.3 设计理念区别

抽象类:被继承体现的是 " is a " 关系,共性功能。

接口:被实现体现的是 " like a " 关系,拓展功能。

4.4 相同点

接口和抽象类都不能被实例化。只能被其他类实现和继承。 

接口和抽象类都可以包含抽象方法,实现接口和抽象类的类都必须实现这些抽象方法,否则实现的类就是抽象类。 

4.5 不同点

抽象类与接口定义不同:抽象类 abstract class,接口  interface。

接口里只能包含抽象方法,不包含已经实现的方法;抽象类则完全可以包含普通的方法。 

接口里不能定义静态方法;抽象类可以定义静态方法。

接口里只能定义静态常量属性,不能定义普通属性;抽象类里既可以定义普通属性, 也可以定义静态常量。

接口不包含构造函数;抽象类包含构造函数,抽象类里的构造函数并不是用于创建对象,而是让其子类调用这些构造函数来完成属于抽象类的初始化操作。

接口不包含初始化块,但抽象类可以包含初始化块 

一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口以弥补 Java 单继承的不足。

抽象类与接口1. 抽象类2. 接口3. 关系总结4. 抽象类和接口的区别

注意:在开发中,一个类不要去继承一个已经实现好的类,要么继承抽象类,要么实现接口 

通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。 

通过接口可以指明多个类需要实现的方法,一般用于定义对象的扩张功能。 

接口主要用来定义规范。解除耦合关系。