常有面试题中常有这个题,可以2个层面来回答这个问题(当然我想面试官应该对你UML建模中类图设计能力更感兴趣)。
一、从语法角度:
抽象类:可以有自己的构造器,抽象方法,成员方法,且可以用各种修饰符
接口:属性必须是常量,只能使用public 修饰符,只能有抽象方法。
二、从设计角度:
抽象类:一般作为基类,被子类所及继承并重写。有一些共有的行为。
接口: 是一种特性的存在并非共通的。
如:智能机(实现类)与老年机(实现类)都继承自手机(抽象类)它可以发短信,和打电话,但智能机可以玩游戏,
而玩游戏是一个特性,所以被设计成了接口来实现。
下面讲解下重写,多态。便于更好的理解,这两者的设计。这里可以先使用UML中的类图去设计。(注: 在UML中有类图的概念,类图是用于描述类之间的关系)。
业务场景:从多态的角度设计下 动物 与 猫 鸟 之间的关系并使用抽象类和接口 来描述下他们的行为。
1、将动物类设计成抽象类
2、设计猫和鸟类继承至动物类并重写叫方法
3、设计飞这个特性接口并让鸟实现该接口
4、最后使用多态的方式调用叫。动物类就会自动的找到具体的动物并执行叫的方法(这里可以设计成静态工厂的设计模式实现)
以下是伪代码重在感受这种设计。
//动物 public abstract class Animal { public void talk() { System.out.println("动物叫"); } } //鸟类 public class Bird extends Animal implements Fly { public void talk() { System.err.println("叽叽喳喳"); } @Override public void fly() { System.out.println("向南飞"); } } //猫 public class Cat extends Animal { public void talk() { System.out.println("瞄"); } } //飞的接口 public interface Fly { public void fly(); } //多态的实现 public static void main(String[] args) { Animal animal=new Cat();//瞄 animal.talk(); Animal animal2=new Bird(); //叽叽喳喳 animal2.talk(); }