JAVA 抽象类与接口 基础知识点

JAVA 抽象类与接口

一、抽象类

了解抽象类要先了解 abstract 关键词,在一个方法声明前加上abstract,这个方法就叫做抽象方法。抽象方法仅有声明而没有方法体。

 

    abstract void f();

 

而包含抽象方法的类就是抽象类。抽象类必须在声明时也加上abstract关键词。抽象类本身是不能用来创建对象的。当然你也可以单纯的给类加上abstract关键词而不写抽象方法,但这除了阻止产生这个类的对象没有意义。

如果继承一个抽象类却不为基类的所有抽象方法提供定义,那么导出类也是抽象类,并且编译器会强制使用abstract来限定。

假设有Wind、Percussion、Stringed三个类继承了抽象类Instrument,抽象方法为play(),Brass,Woodwind又继承了Wind。

Instrument[] orchestra = {

​ new Wind(),

​ new Percussion(),

​ new Stringed(),

​ new Brass(),

​ new Woodwind

};

for( Instrument i : orchestra ){

​ i.play();

}

注:与普通的基类和子类相同,由于抽象基类与子类都具有play() 方法,输出时的play()方法会因为多态的特性显示为各自的实现。

二、接口

用来修饰接口的关键字是interface,这个关键字用来代替class,可以用public等来修饰。接口默认有包访问权限,同时域隐式地是static和final的,所以可以省略。

(tip:Java中具有常量初始化值的static final时,会用大写字母的风格,在一个标识符中,用下划线来分割单词)

在接口中定义的域不能是“空final”(也就是没有被初始化),但是可以被非常量表达式初始化。

接口是一个完全抽象的类,所有的方法都要由继承类来定义。它允许创建者确定方法名、参数列表和返回类型。作为一个极度抽象的类,不允许非抽象方法的存在。

要让继承类来实现接口(一个或一组),需要使用implements关键字,类似于extends。

要实现一个接口时,方法必须被设置为public的,否则在继承的过程中,方法的访问权限就被降低了(从接口中的默认public变成了类默认的protected)。

在Java中,类不能多重继承,但是可以实现多个接口,这些类全部置于implements关键字后。实现类可以向上转型为每个接口因为每个接口都是独立类型。

接口可以继承多个接口,extends后面接多个接口名就行。

在对接口实现多重继承时,要注意一个问题,那就是不同的接口类可能有同名的方法,如果返回值和参数都相同,那么问题不大,但是如果不同,覆盖、实现和重载就搅在了一起,而且重载不能仅通过返回类型区分,所以应该避免,不然会报错。

使用接口的核心原因:为了能够向上转型为多个基类型(以及由此带来的灵活性,比如说多个类实现了同一个接口,那么它们就可以通过向上转型的方式产生一些便捷的操作)。第二个原因是为了防止客户端程序员创建该类的对象,并确保这仅仅是一个接口。(第二个原因不太理解)

接口是实现多重继承的途径,而生成遵循某个接口对象的典型方式就是工厂方法设计模式,通过在工厂对象上调用创建方法,直接生成接口的某个实现的对象,可以将代码与接口的实现分离。好处是:可以透明的将某个实现替换为另一个实现(个人理解是,当更改实现类的代码时,不需要去修改创建该类实例的相关代码)。

​ 添加这种额外级别的间接性,一个常见的原因就是想要创建框架。

猜你喜欢

转载自www.cnblogs.com/mutojack/p/9097168.html