抽象类与接口的区别
1.1interface 和 abstract class 的区别
1)在面向对象领域,由于抽象的概念在问题领域没有对应的具体概念,所以用于表征抽象概念的抽象类是不能实例化的;同时,抽象类体现了数据抽象的思想,是实现多态的一种机制。抽象类定义了一组抽象方法,至于这组抽象方法的具体表现形式则是由抽象类的子类(或派生类)来实现。同时,抽象类提供了继承的概念,它的出发点就是继承,没有了继承,抽象类也就没了任何存在的意义。抽象类一定是来继承的,同时以一个抽象类为节点的继承关系等级链中,叶子节点一定是具体的实现类。
2)使用抽象类时需注意以下几点:
抽象类不能被实例化,具体实例化由其子类完成;
抽象方法必须由子类进行重写;
只要包含一个抽象方法的类就必须声明定义为抽象类,不管是否还包含其他方法;
抽象类可以包含具体的方法,也可以不包含抽象的方法;
子类中的抽象方法不能和父类的抽象方法重名;
abstract和final、private、static、native不能并列修饰同一个类;
3)创建抽象类和抽象方法非常有用,因为他们可以使类的抽象性明确起来,并告诉用户怎么去使用它们;抽象类还是很好的重构器,因为它们使我们可以很容易的将公共方法沿着继承层次结构向上移动;
4)接口本身不是类,接口是抽象类的延伸。Java保证数据安全是不允许多重继承的,即继承只能存在一个父类,而接口不同,一个类可以实现多个接口,不管这些接口有没有关系,所以接口弥补了抽象类不能多重继承的缺陷;但是推荐抽象类和接口联合使用,这样既保证了数据安全性,又实现了多重继承。
5)使用接口时需注意以下几点:
Interface的所有方法的访问权限自动被声明为public,确切来说只能是public,当然你也可以显式声明为private、protect,但是编译时会报错;
接口中可以定义“成员变量”,或者说是不可变的常量,因为接口中的“成员变量”会自动变成public static final。可以通过类命名直接访问 ImplementClass.name
接口中不能有方法的具体实现;
实现接口的非抽象类必须要实现接口中所有方法,抽象类可以不实现;
在实现多接口的时候一定要避免方法名的重复;
不能用new操作符实例化接口,不过可声明一个接口变量,该变量必须引用一个实现该接口的类的对象;可以使用instanceof来检测一个对象是否实现了一个特定的接口 eg:if ( anObject instanceof Comparable ) {};
6)两者的区别:
抽象类方法中,可以拥有任意范围的成员数据,同时也可以拥有自己的非抽象方法,但是在接口中,它仅能有静态的、不能改变的成员数据,同时它的所有方法必须都是抽象的。从某种程度上说,接口可以说是抽象类的特殊一种;对于子类来讲,只能继承一个抽象类(考虑到java的数据安全性),但是可以实现多个接口;
从设计层次来区别:
抽象层次不同:抽象抽象类是对类的抽象,包括类的属性、行为,接口是对类局部(行为)的抽象;
跨域不同:抽象类跨域是具有相似特点的类,而接口可以跨域不同的类;