java面向对象之 接口与抽象类的区别

java面向对象之 接口与抽象类的区别

常有面试题中常有这个题,可以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();
     }