抽象类和接口

抽象类与抽象方法

抽象方法和抽象类必须用abstract修饰符来定义
有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法。

抽象方法和抽象类的规则

抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体;
抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。即使抽象类里不包含抽象方法,这个抽象类也不能创建实例;
抽象类可以包含Field、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类、枚举类6种成分。抽象类的构造器不能用于创造实例,主要用于被其子类调用;
含有抽象方法的类只能被定义成抽象类。

接口的概念

Java中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)

接口的定义

和类定义不同,定义接口不再使用class关键字,而是使用interface关键字。接口定义的基本语法如下:
[修饰符] interface 接口名 extends 父接口1,父接口2...
{
零个到多个常量定义...
零个到多个抽象方法定义...
}

接口定义详解

修饰符、接口名应与类定义一样的规则;一个接口可以有多个直接父类,但接口只能继承接口,不能继承类。

由于接口定义的是一种规范,因此接口里不能包含构造器和初始化块定义。接口里可以包含Field(只能是常量)、方法(只能是抽象实例方法)、内部类(包括内部接口、枚举)定义;

同时接口里定义的是多个类共同的公共行为规范,因此接口里的所有成员都是public访问权限。定义接口成员时,可以省略访问控制修饰符,如果指定访问控制修饰符,则只能使用public访问控制修饰符;
在接口中定义Field时,不管是否使用public static final修饰符,接口里的Field总将使用这三个修饰符来修饰。而且,接口里没有构造器和初始化块,因此接口里定义的Field只能在定义时指定默认值。

由于接口里的方法全部是抽象方法,因此接口里不允许定义静态方法。不管定义接口里方法时是否使用public abstract修饰符来修饰接口里的方法,接口默认使用public abstract来修饰该方法
接口的继承

接口的继承和类继承不一样,接口完全支持多继承,即一个接口可以有多个直接父接口。和类继承相似,子接口扩展某个父接口,将会获得父接口里定义的所有抽象方法、常量Field。

一个接口继承多个父接口时,多个父接口排在extends关键字之后,多个父接口之间以英文逗号(,)隔开。

接口的使用

接口不能用于创建实例,但接口可以用于声明类型变量。当使用接口来声明引用类型变量时,这个引用类型变量必须引用到其实现类的对象。除此之外,接口的主要用途就是被实现类实现。

一个类可以实现一个或多个接口,继承使用extends关键字,实现则使用implements关键字。因为一个类可以实现多个接口,这也是java为单继承灵活性不足所做的补充。类实现接口的语法格式如下:

[修饰符] class 类名 extends 父类 implements 接口1,接口2...
{
类体部分
}

接口不能显式继承任何类,但所有接口类型的引用变量都可以直接赋给Object类型的引用变量。

接口和抽象类

共同点

1.它们都不能使用new关键字创建实例
2.它们都可以包含抽象方法

不同点

1.接口只能包含抽象方法,抽象类可以包含抽象方法和普通方法
2.接口里只能包含常量,抽象类里不仅可以定义常量,还可以定义成员变量
3.接口里不能包含初始化块和构造器,抽象类里可以包含初始化和构造器
4.定义抽象类使用abstract class定义,定义接口则使用interface关键字
5.继承抽象类使用extends,而接口则用implements来实现
6.抽象类不仅可以继承抽象类,还可以实现接口,接口只能继承接口,不能继承任何类
7.使用抽象类则只能继承一个,实现接口则可以实现多个

抽象类与接口注意点

利用抽象类和抽象方法的优势,我们可以更好地发挥多态的优势,是的程序更加灵活。当使用abstract修饰类时,表明这个类只能被继承;当使用abstract修饰方法时,表明这个方法必须由子类提供实现(即重写)。而final修饰的类不能被继承,final修饰的方法不能被重写。因此final和abstract永远不能同时使用;
abstract不能修饰Field、局部变量、构造方法;
当使用static修饰一个方法时,表明这个方法属于该类本身,即通过类就可以调用该方法,但如果该方法被定义成抽象方法,则将导致通过该类调用该方法时出现错误(调用了一个没有方法体的方法肯定会引起错误)。因此static和abstract不能同时修饰某个方法,即没有所谓的类抽象方法;
abstract关键修饰的方法必须被其子类重写才有意义,否则这个方法将永远不会有方法体,因此abstract方法不能定义为private访问权限,即private和abstract不能同时修饰方法。

原文地址:https://www.cnblogs.com/t0404/p/10291080.html