黑马程序员:抽象类和接口
来源:互联网 发布:淘宝网店页头图片 编辑:程序博客网 时间:2024/06/08 02:56
一、 抽象类
抽象类格式:(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
- 黑马程序员-----抽象类和接口
- 黑马程序员_抽象类和接口
- 黑马程序员 Java 抽象类和接口
- 黑马程序员_03 抽象类和接口
- 黑马程序员_抽象类和接口
- 黑马程序员—抽象类和接口
- 黑马程序员—抽象类和接口
- 黑马程序员------- 抽象类和接口-------
- 黑马程序员_接口和抽象类
- 黑马程序员_抽象类和接口
- 黑马程序员:抽象类和接口
- 黑马程序员--抽象类和接口
- 黑马程序员------------抽象类 接口
- 黑马程序员:抽象类、接口
- 黑马程序员_抽象类和接口的比较
- 黑马程序员_Java抽象类和接口的比较
- java_抽象类和接口(黑马程序员)
- 黑马程序员-抽象类 模板方法和接口
- ubuntu9.10 apt-get 问题
- 《自己动手写操作系统》—— 工作环境搭建
- 黑马程序员:内部类
- asp.net参数传递
- 编译安装PHP
- 黑马程序员:抽象类和接口
- UVa 10533 - Digit Primes
- vim map nmap
- 黑马程序员:类,对象,面向对象以及三大特征
- 淘宝内核组的一个关于测试机器性能的帖子,很有意思
- ICE网格计算
- Linux
- IDA Pro逆向实战之Crackme(简单篇)
- Ice手册,第39章IceGrid 第5节使用部署