一直都在使用接口,没怎么用过抽象类,今天面试遇到了面试官提问:
抽象类和接口有什么区别啊?
下面就关于这个问题好好研究一下,希望在以后的工作中能牢记。。
以下是《疯狂java讲义》第三版对他们的解释:
- 接口可以继承接口。
- 抽象类可以实现(implements)接口,但不可以继承自接口。
- 抽象类可以继承具体类。
- 抽象类中可以有静态的 main方法。抽象类里可以有抽象方法,抽象方法一定要在抽象类里,抽象类可以派生,抽象类的父类可以是非抽象类。
- 某一个类如果定义了某个方法是抽象方法,其子类并非一定要实现(不想实现父类中的抽象方法的话,子类同样定义成抽象类就是了)。
- 当你想实例,就要实现所有抽象方法。
- 可以使用接口声明对象,但必须使用其实现类实例化,接口实例化报错。
- Collection list = new ArrayList();Collection是接口,Arraylist是其实现类。这样的话,接口引用c就指向了具体的实现接口的对象,多态的体现。这样的好处在于通过接口c来调用的方法可以屏蔽掉具体的方法实现。换而言之,我只需要知道c要做什么,而不需要知道c怎么做,也就是在JAVA编程中经常用到的接口回调,即面向接口的编程更为重要的一点是Collection c只是引用,是一个指向具体实现类的引用。
一、使用区别
接口:
类中使用时需要实现本接口的方式
抽象类:
类中使用时是采用继承本类的方式
举例:
1、现在有抽象类动物类(AnimalInfo.java)
public abstract class AnimalInfo {
public abstract void cry();//哭方法
public void call(){}//正确的方式
//public void cry(); //错误的方式
}
2、有接口类动物类(Animal.java)
public interface Animal {
public void cry();
public abstract void call(); //正确的方式
// public abstract void hit(){};//错误的方式
}
新建一个动物:猫(Cat.java)
实现哭方法的第一种方式:继承抽象类AnimalInfo.java
public class CatInfoextendsAnimalInfo {
//实例化时必须实现cry()方法
private AnimalInfo am=new AnimalInfo() {
@Override
public void cry() {
}
};
/**由于继承AnimalInfo类而必须实现的cry()方法*/
@Override
public void cry() {
//调用方法
am.call();
}
}
实现哭方法的第二种方式:实现接口类Animal.java
public class Cat implementsAnimal{
@Override
public void cry() {
}
}
二、定义
接口:特殊的抽象类,接口中可以有抽象方法
抽象类:抽象类中的方法都是抽象方法