一、概念
- 接口和抽象类的概念:
抽象类:
在面向对象的领域内,一切都是对象,所有的对象都是通过类来进行描述的,但并不是所有的类都是用来描述对象的。如果一个类没有足够的信息来描述一个具体的对象,需要其他类来支持,那么这样的类就是抽象类。
eg: new Animal(),我们知道这是产生一个动物Animal对象,但是这个Animal对象具体是什么、什么样子,我们并不清楚,它是一个抽象的物体,不是具体的动物的一个概念,所以它就是一个抽象类,需要一个具体的动物来描述,它是什么长什么模样,如:狗…
在使用抽象类的时候要注意下面的几个问题:
a. 抽象类不能被实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可。
b. 抽象方法必须由子类来进行重写。
c. 只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含其他方法。
d. 抽象类中可以包含具体的方法,当然也可以不包含抽象方法。
e: 子类中的抽象方法不能与父类中的抽象方法同名。
f. abstract 不能与 final 并列修饰一个类。
g. abstract 不能与 private、static、final、native并列修饰同一个方法。
创建抽象类和抽象方法非常有用,以为它们可以使类的抽象性明确起来,并告诉用户个编译器打算怎么样使用它们。
抽象类还是有用的重构器,因为它们使我们可以很容易地将公共方法沿着继承层次结构向上移动。
实例: 定义一个抽象动物类Animal,提供抽象方法叫做cry( ),猫和狗都是动物类的子类,所以Dog和Cat必须要继承Animal父类的cry( )方法:
public abstract class Animal {
public abstract void cry();
}
----------------------------------------------------------------------------------------------------
public class Cat extends Animal{
@Override
public void cry() {
System.out.println("猫叫:喵喵...");
}
}
----------------------------------------------------------------------------------------------------
public class Dog extends Animal{
@Override
public void cry() {
System.out.println("狗叫:汪汪...");
}
}
----------------------------------------------------------------------------------------------------
public class Test {
public static void main(String[] args) {
Animal a1 = new Cat();
Animal a2 = new Dog();
a1.cry();
a2.cry();
}
}
--------------------------------------------------------------------
Output:
猫叫:喵喵...
狗叫:汪汪...
接口:
接口是一种比抽象类更加抽象的“类”,但接口本身就不是类,我们不能实例化一个接口, 如new Runnable();肯定是错误的,我们只能new它的实现类。
接口是用来建立类与类之间的协议,它所提供的只是一种形式,而没有具体的实现。同时该接口的实现类必须要实现该接口的所有的方法,通过使用implements关键字,它表示该类在遵循某个或者特定的接口,同时也表示着“interface”只是它的外貌,但是现在需要声明它是如何工作的。
接口是抽象类的延伸,java保证数据安全是不能多重继承的,也就是说继承只能存在一个父类,但是接口不同,一个类可以同时实现多个接口,不管这些接口之间有没有关系,所以接口弥补了 抽象类不能多重继承的缺陷,但是推荐继承和接口共同使用,因为这样既可以保证数据安全,又可以实现多重继承。
在使用接口的时候要注意下面的几个问题:
a. 所有Interface 的方法访问权限被声明为public,确切的说只能为public。当然也可以显示的声明为protected、private,但是编译会出错。
b. 接口中可以定义“成员变量”(即不可变的常量),因为接口中的“成员变量”会自动为public static final。可以通过类名直接访问:ImplementClass.name。
c. 接口中不存在实现的方法。
d. 实现接口的非抽象类必须要实现该接口的所有方法。抽象类可以不要实现。
e. 不能使用 new 操作符实例化一个接口,但可以声明一个接口变量,该变量必须引用(refer to)一个实现该接口的类的对象。可以使用instanceof 检查一个对象是否实现了某个特定的接口。 eg: if(anObject instanceof Comparable) { }
f. 在实现多接口的时候一定要避免方法名的重复。
二、区别:
1.接口和抽象类的区别
①抽象类里可以有构造方法,而接口内不能有构造方法。
②抽象类中可以有普通成员变量,而接口中不能有普通成员变量。
③抽象类中可以包含非抽象的普通方法,而接口中所有的方法必须是抽象的,不能有非抽象的普通方法。
④抽象类中的抽象方法的访问类型可以是public ,protected和默认类型,但接口中的抽象方法只有public和默认类型。
⑤ 抽象类中可以包含静态方法,接口内不能包含静态方法。
⑥抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static类型,并且默认为public static类型。
⑦一个类可以实现多个接口,但只能继承一个抽象类。
⑧接口更多的是在系统框架设计方法发挥作用,主要定义模块之间的通信,而抽象类在代码实现方面发挥作用,可以实现代码的重用。