如发现文中的错误,或内容需要补充,忘不吝指教!
CHALLENGE 2.1
Write down three differences between abstract classes and interfaces in Java.
要想回答这个问题首先要搞清楚几个概念问题。给出了一些概念在此引用
http://blog.csdn.net/chenssy/article/details/12858267
1.抽象类是什么一个具有abstract methods的类叫做抽象类,抽象类中可以不含有任何抽象方法,但是如果类中含有一个或多个抽象方法那么该类必须声明为抽象类(并不强制所有方法都是abstract的)。
如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类我们称它为抽象类。比如new Animal(),我们都知道这个是产生一个动物Animal对象,但是这个Animal具体长成什么样子我们并不知道(depend on runtime info),它没有一个具体动物的概念,所以他就是一个抽象类,需要一个具体的动物,如狗、猫来对它进行特定的描述,我们才知道它长成啥样。
在面向对象领域由于抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能实例化的。
2.为什么会有不含有任何抽象方法的抽象类
因为抽象类是不能实例化的,所以可以通过对类声明abstract来阻止该类的实例化。
3.抽象类的作用
由于面向对象和运行时绑定的存在,我们无法在编译期间确定所有生成的具体对象,即多态的概念(polymorphism).我们通过建立一个basic abstract class 为所有derived class提供一些common method。以便我们可以通过这些common method来操作derived classes。用C++中的说法就是用父类的指针去操作子类instance,在Java中应该说是用父类的reference去操作子类的instance。所以抽象类的作用就是让其他类来继承它。
4.抽象类一些要求
1、抽象类不能被实例化(不能new 可以声明reference),这是因为抽象类无法描述一个完整的instance 所以要到运行时子类来instantiate.
2、抽象方法必须(Must be)由子类来进行重写,这是因为abstract class中的abstract method都是空方法,子类不实现它就无法使用。
3、只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含有其他方法。
4、抽象类中可以包含具体的方法,当然也可以不包含抽象方法。
5、子类中的抽象方法不能与父类的抽象方法同名。
6、abstract不能与final并列修饰同一个类。这个很容易理解吧,abstract的意思就是让其他类来继承,final修饰class就是表示这个类不让别的类继承,同时修饰一个类就矛盾了。
7、abstract 不能与private、static、final或native并列修饰同一个方法。Abstract method就是留给子类实现的,要么是protected的要么是public的,否则子类得不到这个方法。Static会似的该方法静态化,可以直接通过abstract class来调用,但是abstract方法是空的,这样做是没意义的。
4.接口的作用
Interface使得所有实现了该接口的类建立了一套协议(protocol),使得这些类有了一套相同的manipulation。此外,在java中不能multiple inheritance所以无法通过继承抽象类来同时拥有多套common method。但是一个class可以实现多个interface,从另一个方面解决了 multiple inheritance的需求。
(1) Interface的方所有法访问权限自动被声明为public。确切的说只能为public,当然你可以显示的声明为protected、private,但是编译会出错!(interface就是强迫实现他的类完成该interface的所有方法,再去隐藏方法就没有意义了)
接口中可以定义“成员变量”,或者说是不可变的常量,因为接口中的“成员变量”会自动变为为public static final。可以通过类命名直接访问:ImplementClass.name。(因为interface并不会被实例化这些变量只是用来辅助记录一些interface的信息,放到常量区中存放)
(2) 接口中不存在实现的方法。(前面已经介绍过了,所有方法都是空body的)
实现接口的非抽象类必须要实现该接口的所有方法。抽象类可以不用实现。(抽象类实现一个接口的目的是:让继承该抽象类的子类去完成所有的事情,无需在抽象类中做具体实现,这是因为可能不止一个类需要继承这个abstract class,无法确定interface中的方法到底应该是怎么样实现的)
(3)不能使用new操作符实例化一个接口,但可以声明一个接口变量,该变量必须引用(refer to)一个实现该接口的类的对象(类似多态的感觉 Interface referece A = new Obj_Implemented)。可以使用 instanceof 检查一个对象是否实现了某个特定的接口。例如:if(anObject instanceof Comparable){}。
在实现多接口的时候一定要避免方法名的重复。
现在回到Design Pattern的 Challenge吧
Interface与Abstract class 的异同
- 一个类可以实现多个interface,但是最多只能继承一个Abstract class
- Abstract class 可以含有具体的(implemented的方法),而Interface中的全是空body的方法
- Abstract class可以使用成员变量,而Interface的成员变量都只能是static final的
- Abstract class可以通过 public,protected,private来修饰那些具体的方法,但是不能用private或者static,native等去修饰抽象的方法。而Interface中的方法都只能是public的,如图所示
- Abtract class可以定义constructor,Interface不行
abstract class C { public void method(){}; private void pri_method(){}; void pack_method(){}; abstract public void ab_pub_method(); abstract protected void ab_pro_method(); abstract private void ab_pri_method();//error }
interface A { protected void A();//error abstract void B(); }