抽象类与接口的知识点概述
JAVA中接口和抽象类的定于语法分别为interface于abstract关键字
抽象类:在JAVA中被abstract关键字修饰的类称为抽象类,被abstract关键字修饰的方法称为抽象方法,抽象方法只有方法的声明,没有方法体。抽象类的特点:
- 抽象类不能被实例化,只能被继承
- 包含抽象方法的一定是抽象类,但是抽象类不一定含有抽象方法
- 抽象类中的抽象方法的修饰符只能为public或者protected,默认为public
- 一个子类继承一个抽象类,则子类必须实现父类抽象方法,否则子类也必须定义为抽象类
- 抽象类可以包含属性、方法、构造方式,但是构造方法不能用于实例化,主要用途是被子类调用
接口:JAVA中接口使用interface关键字修饰,特点为:
- 接口可以包含变量、方法;变量被隐式指定为public static final,方法被隐式指定为public abstract
- 接口支持多继承,即一个接口可以extends多个接口,间接的解决了JAVA类中的但继承问题
- 一个类可以实现多个接口
- JDK1.8中对接口增加了新的特性:
1)默认方法(default method):JDK 1.8允许给接口添加非抽象的方法实现,但必须使用default关键字修饰;定义了default的方法可以不被实现子类所实现,但只能被实现子类的对象调用;如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法;
2)静态方法(static method):JDK 1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。接口静态方法只能通过接口调用(接口名.静态方法名)
接口于抽象类的异同
相同点
- 都不能被实例化
- 接口类的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化
不同点
- 不能为普通方法提供方法体 接口类里只能包含抽象方法,静态方法和默认方法(加default),不能为普通方法提供方法实现,抽象类则完全可以包含普通方法,接口中的普通方法默认为抽象方法
- public static final 赋值 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型,并且必须赋值,否则通不过编译
- 是否有构造器 接口不能包含构造器,抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作
- 不能包含初始化块 接口里不能包含初始化块,但抽象类里完全可以包含初始化块
- 继承一个抽象类、多个接口 一个类只能继承一个抽象类,而一个类却可以实现多个接口
知识点例子
public interface Person{
public static final int a=10;
//JDK1.8
default void sayHello(){
System.out.println("Hello World");
}
public void say();
}
public abstract class Person{
public abstract void say();
public void eat(){};
}
由上述代码所示:
接口知识功能的定义,而抽象类既可以为功能的定义也可以为功能的实现
小结
接口知识功能的定义,而抽象类既可以为功能的定义也可以为功能的实现
接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。
抽象类表示的是,这个对象是啥。接口表示的是,这个对象能做啥。
看到一个非常生动的例子:比如男人,女人,这两个类,他们的抽象类是人,那就说明他们都是人。人吃东西,狗吃东西,把“吃东西”定义成一个接口,然后让类去实现它。所以在高级语言上,一个类只能继承一个抽象类(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)
因此,当关注一个事物的本质时,用抽象类;当关注一个操作时,用接口。
抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为对于高级语言来说,每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它知识针对一个动作的描述,而且你可以在类中同时实现多个接口,在设计阶段可以降低难度