培训第14天----Java接口和抽象类详解

          今天讲的东西是Jq,而且讲的好像都没有什么用。。。。实在听不进去,决定把自己薄弱的接口和抽象类再来

总结一下。下面进入正题。

参考文献:http://www.cnblogs.com/dolphin0520/p/3811437.html

一.抽象方法

           在知道什么是抽象类之前,我们需要知道什么是 抽象方法。用 abstract 关键字修饰的方法就是抽象方法,抽象

方法只有方法的声明,没有方法的实现。并且抽象方法对于修饰词也是非常挑剔的:1)不能是private修饰,因为抽象

方法并没有具体的实现,只是一个声明,所以它需要被继承或实现,在被重写,而一旦用了private修饰,该方法就只能

被当前类所访问,外部看不到,也就没有所说的继承或实现了。2)不能是包访问权限defalt修饰,同理,也需要考虑到

继承的问题,defalt只能是在包内继承,包外就不可以了,这样会有相当大的隐患。3)抽象方法不能被final,或者static

来修饰,final关键字会将方法定义为不可继承。static修饰的方法可以被继承,但是会被定义为不可重写。所以在定义抽

象方法的时候修饰词通常用public或protected。

二.抽象类

          在我们知道了什么是抽象方法之后,就来认识一下抽象类。抽象类的本质和普通类并没有什么区别,它也可以有自

己的成员变量和成员方法。不同的是,抽象类用abstract来修饰类,并且抽象类中包含抽象方法。有抽象方法的类叫做抽

象类,但是没有抽象方法的类也不一定不是抽象类,一个类是不是一个抽象类取决于类前有没有 abstract 修饰。

           既然抽象类中有抽象方法,并且抽象方法如果不被重写,那么这个抽象方法将毫无意义。抽象类的子类必须重写

抽象类中所有的抽象方法,哪怕有一个没有被重写,那么这个子类也必须定义为抽象类。既然抽象类中有 没有实现的方法

(行为),那么创建抽象类的实例并没有意思,所以Java规定,抽象类允许创建实例。

三.接口

            抽象类是对事物的抽象,比抽象类更加抽象的就要数接口了。接口中可以含有属性和方法,但是其中的方法全部都

要是抽象方法。属性默认是public static final 类型的,并且只能是public static fina类型的。方法会被隐似指定为public abstract

(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现。

四.接口和抽象类的区别

语法层面的区别:         

            1)抽象类中可以有普通的成员方法,接口中只能存在public abstract类型的抽象方法。

            2)抽象类中可以有任意类型的成员变量,接口中只能有public static final修饰的常量。

            3)抽象类可以有静态代码块和静态方法,接口中不能含有静态代码块以及静态方法(因为静态随着类的加载而加载

,它们是属于类的,静态方法可以被继承,但不能被重写)。

         4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。

设计层面的区别:

              简单来说:1)抽象类是对一类有共同特征事物的抽象,而接口是对行为的抽象。2)抽象类要表达的是“属不属于”,

接口表达的是“有没有,具不具备”。

            下面我们来举一个简单的例子:

             比如现在有需求,要在门上面安装报警功能,我们知道门有开和关两种功能,并且每个门的功能是不同的,所以我

们要定义一个抽象类:

             如果是门的话就继承这个抽象类,重写里面的抽象方法,来说明这个子类是一个门。

            我们还要把警报这个功能定义为接口, 事物如果需要这个功能就实现这个接口。

             不把这三个抽象方法全都定义在抽象类中或者接口中的原因是,门不一定都需要警报的这个功能,而需要

报警这个功能的shi'事物,不一定要open或close这个行为,所以我们要分开定义然后进行组合。

猜你喜欢

转载自blog.csdn.net/qq_41160264/article/details/81190469