Design Pattern in Java[Challenge 2.1]

尝试用简单的语言,讲述复杂的事情。

如发现文中的错误,或内容需要补充,忘不吝指教!

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来阻止该类的实例化。

扫描二维码关注公众号,回复: 400270 查看本文章

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子类中的抽象方法不能与父类的抽象方法同名。

         6abstract不能与final并列修饰同一个类。这个很容易理解吧,abstract的意思就是让其他类来继承,final修饰class就是表示这个类不让别的类继承,同时修饰一个类就矛盾了。

         7abstract 不能与privatestaticfinalnative并列修饰同一个方法。Abstract method就是留给子类实现的,要么是protected的要么是public的,否则子类得不到这个方法。Static会似的该方法静态化,可以直接通过abstract class来调用,但是abstract方法是空的,这样做是没意义的。

 

4.接口的作用

Interface使得所有实现了该接口的类建立了一套协议(protocol),使得这些类有了一套相同的manipulation。此外,在java中不能multiple inheritance所以无法通过继承抽象类来同时拥有多套common method。但是一个class可以实现多个interface,从另一个方面解决了 multiple inheritance的需求。

5..接口的一些要求

1    Interface的方所有法访问权限自动被声明为public。确切的说只能为public,当然你可以显示的声明为protectedprivate,但是编译会出错!(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

InterfaceAbstract class 的异同

  1. 一个类可以实现多个interface,但是最多只能继承一个Abstract class
  2. Abstract class 可以含有具体的(implemented的方法),而Interface中的全是空body的方法
  3. Abstract class可以使用成员变量,而Interface的成员变量都只能是static final
  4. Abstract class可以通过 publicprotectedprivate来修饰那些具体的方法,但是不能用private或者staticnative等去修饰抽象的方法。而Interface中的方法都只能是public的,如图所示
  5. Abtract class可以定义constructorInterface不行

 

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();
}

 

 

 
 
 

猜你喜欢

转载自vergilwang.iteye.com/blog/2020968