黑马程序员:抽象类和接口

来源:互联网 发布:淘宝网店页头图片 编辑:程序博客网 时间:2024/06/08 02:56
-------android培训java培训、期待与您交流! -------

一、 抽象类

抽象类格式:(public或者default) abstract 类名

抽象类初步理解:普通类可以理解为具体类,它能被实例化。抽象类是抽象的,所以不能被实例化。

抽象类进一步理解:当多个类中出现相同功能,但是功能主体不同,这是可以向上抽取。只抽取功能定义,而不抽取功能定义,就形成了抽象类。

抽象类体现的是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会大致保留抽象类的行为方式。

抽象类的特点:

1、含有抽象方法的类只能被定义为抽象类。

2、抽象方法和抽象类都必须被abstract关键字修饰,但是abstract不能修饰变量。

3、抽象类不能用new关键字来调用抽象类的构造器创建对象,即使抽象类里不包含抽象方法,这个抽象类也不能创建实例。

4、抽象类中的抽象方法要被使用,必须由子类覆盖全部抽象方法后,建立子类对象调用。如果子类只覆盖了这个抽象父类部分抽象方法,那么该子类还是一个抽象类。

5、抽象类在继承方面和一般类一样,支持单继承,多实现。例如API中:public abstract class Reader extends Object implements Readable,Closeable

抽象类的细节:

1、抽象类中有构造函数,用于子类实现后给子类对象进行初始化。

2、抽象类与一般类没有太大区别,可以用“有得有失”形容,

得:抽象类得到一个能力,可以包含只定义方法声明却没有方法体的抽象方法。

失:抽象类失去一个能力,不能创建该类的实例化对象。

3、abstract关键字不能与final,private,static关键字一起使用。原因如下:

(1) final修饰的类不能被继承,被修饰的方法不能被覆盖。

(2) private修饰的成员方法只能被本类访问,覆盖也就无从谈起。

(3) static关键字修饰的成员方法附属于类,可以用类名调用,如果再用Abstract修饰(方法没有方法体),调用起来还有什么意义。

4、抽象类中抽象方法可有可无,但是抽象方法所在的类一定是抽象类。

注意:抽象方法和空方法体的方法不是同一个概念。前者根本没有方法体,后者有方法体但方法体什么都不做。

abstract class Student{abstract void study1();abstract void study2();void study3(){System.out.println("抽象类中的非抽象方法");}}abstract class BaseStudent extends Student//因为只复写了一部分抽象方法,所以还是个抽象类{void study1(){System.out.println(" base study1");}}class AdvStudent extends Student//覆盖父类全部抽象方法,可以实例化对象。{void study1(){System.out.println("adv study1");}void study2(){System.out.println("adv study2");}void work(){System.out.println("adv work");}}class AbstractDemo{public static void main(String[] args){AdvStudent as = new AdvStudent(); as.study1();//打印adv study1as.study2();//打印adv study2Student s = new AdvStudent(); s.study1();//打印adv study1s.study2();//打印adv study2s.study3();//打印抽象类中的非抽象方法}}

由代码可见,抽象类和抽象方法的出现,不但能形成继承体系提高代码复用性,而且可以更好地发挥多态的优势,提高程序的灵活性。

二、 接口

接口格式:(public或者default) interface 接口名

接口初步理解:可以认为是一个特殊的抽象类,当抽象类中的方法都是抽象的,那么该类就可以定义为接口。

接口进一步理解:接口定义的是多个类共同的公共行为规范,这些行为是与外部交流的通道,这就意味着接口通常是定义一组公用方法。

接口的特点:

1、接口中的常量系统默认用publicstatic final三个修饰符来修饰。

2、接口中的方法系统默认用publicabstract两个修饰符来修饰。

3、接口是不可以创建对象的,接口中也没有构造函数。

4、需要被子类实现,子类对接口中的抽象方法全部覆盖后,子类才能实例化,否则子类是一个抽象类。

5、接口可以实现多个父接口,但不能显式的继承任何类,但是所有的接口的引用变量都可以直接赋给Object类型的引用变量。

interface Student{int AGE = 20;//默认public static final三个修饰符void study();//默认public abstract两个修饰符void work();}class StudentA implements Inter{public void study(){System.out.println("study English");}public void work(){System.out.println("teach English");}}class StudentB implements Inter{public void study(){System.out.println("study Chinese");}public void work(){System.out.println("teach Chinese");}}

由代码可见,接口定义的是一种公共行为规范,StudentA类和StudentB类都要有学习和工作的行为。

三、 抽象类和接口的比较

抽象类和接口用法上的异同:

1、抽象类和接口都不能实例化对象。但抽象类可以有构造器和初始化块,而接口不能有。

2、抽象类的成员修饰符可以自定义;接口的成员修饰符是固定并且默认的。

3、抽象类中可以包含静态成员变量,非静态成员变量以及静态普通方法;接口只包含静态常量和抽象方法。

4、抽象类使用的是is a 关系,接口使用的是likea 关系。

5、抽象类可以继承其他类(包括抽象类和非抽象类),也可以被继承,但这种继承都是单继承;接口不能显式的继承任何类,但是可以实现多个父接口。

抽象类和接口在设计目的上的差异:

抽象类作为系统中多个子类的共同子类,它体现的是一种模板式设计。抽象类可以被当成系统实现过程中的中间产品,这个中间产品已经实现了系统的部分功能。但是这个产品依然不能当做最终产品,必须进一步完善。

接口作为系统与外界交互的窗口,接口体现的是一种规范。对于接口的实现者而言,接口规定了调用者必须向外提供哪些服务;对于接口的调用者而言,接口规定了调用者可以调用哪些服务以及如何调用这些服务。当一个程序中使用接口时,接口是多个模块间的耦合标准;当多个应用程序使用接口时,接口是多个程序之间的通信标准。

-------------------------android培训java培训、期待与您交流! ----------------------

详细请查看:www.itheima.com


0 0
原创粉丝点击