抽象类和接口的区别是什么?
一、两者相同点
1、不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2、抽象类里的抽象方法必须全部被子类所实现,子类不能全部实现父类抽象方法,那么该子类还只能是抽象类。一个类实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
二、两者不同点
1、默认的方法实现
抽象类可以有默认的方法实现;接口,Java8规定可以为接口提供默认实现的方法并且不用强。
2、实现
制子类来重写子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要重写抽象类中的抽象方法;接口子类使用关键字implements 来实现接口,它需要重写接口中没有默认。
3、构造器
抽象类可以有构造器,接口不能有构造器。
4、与正常Java类的区别
除了不能实例化抽象类之外,和普通Java类没有任何区别;接口是完全不同的类型外。
5、访问修饰符
抽象方法可有public.protected和default、abstract修饰符。不能用privatestatic.synchronize、 native 修饰。
接口属性默认修饰符是publicstatic final (必须赋初值) ,方法默认修饰符是publicabstract. Java8 开始出现静态方法,多加static关键字。
6、main方法
并且可以运行它;接口没有main方法,因此不能运行它。
7、多继承
抽象类可以继承一个类和实现多个接口;接口只可以继承一个或多个接口。
抽象类的运用意义
在面向对象方法中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。
这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。
由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。
为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。
1. 实现方式不同:抽象类是一个类,可以包含抽象方法和具体方法,可以有成员变量和构造方法;而接口是一个接口,只包含抽象方法和常量,不能有成员变量和构造方法。
2. 多继承支持不同:Java中一个类只能继承一个父类,但可以实现多个接口;而抽象类只能单继承。
3. 语法不同:抽象类使用abstract关键字来定义抽象方法,而接口使用interface关键字来定义接口。
4. 实现方式不同:抽象类的子类必须实现所有的抽象方法,而接口的实现类也必须实现所有的接口方法,但可以有默认实现。
5. 设计目的不同:抽象类用于表示一种抽象的概念,而接口用于表示一种契约,即实现类必须遵守接口中规定的方法。
总之,抽象类和接口都是用来定义抽象方法的,但它们的设计目的、实现方式和语法等方面有所不同,应根据具体情况选择使用。