上一篇文章对象初始化,类构造函数的调用以及多态,这一篇文章继续到抽象类和接口,总结抽象类和接口的基础知识点,同时解答为何会有这些知识点,例如:为什么java的类只能单继承,接口倒是可以引用多个,为什么接口可以继承多个接口,为什么抽象的方法必须实现。然后会在更高的角度出发,理解抽象类和接口。原创不易,转载请注明出处:http://blog.csdn.net/yabay2208
- 抽象类的使用准则以及为何会有这些准则
- 接口的使用准则以及为何会有这些准则
- 从设计的角度观察抽象类及接口(带例子)
一:抽象类的使用准则以及为何会有这些准则
我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的。如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类我们称它为抽象类。同时,如果我们知道这种类是不能被实例化的,仅仅是作为一种规范,比如“动物”,我们都知道new animal()是产生一个动物animal对象,但是这个animal具体长成什么样子我们并不知道,它没有一个具体动物的概念,所以他就是一个抽象类,而且animal类定义的行为规范需要被所有继承他的类遵守。需要一个具体的动物,如狗、猫来对它进行特定的描述,我们才知道它长成啥样。
抽象类为什么不能被实例化?:
在面向对象领域由于抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能实例化的。
抽象类体现了数据抽象的思想,是实现多态的一种机制。它定义了一组抽象的行为准则,至于这组行为准则的具体实现由派生类来实现,他作为一种模板和规范,定义了继承他的子类都必须实现他定义的抽象行为。
在使用抽象类的时候有几点规范需要特别注意,我们会解释为何会有这几点规范:
1、抽象类不能被实例化,实例化的工作应该交由它的不是抽象的子类来完成,我们可以用抽象父类作为一个多态的引用。
2、抽象方法必须由子类来进行重写,如果不重写这些抽象方法,那子类必须要声明为抽象类。
3、只要包含一个抽象方法的抽象类,这个类必须要定义成抽象类,不管是否还包含有其他方法。
4、抽象类中可以包含具体的方法,当然也可以不包含抽象方法。
5、子类中的抽象方法不能与父类的抽象方法同名。
6、 abstract不能与final并列修饰同一个类。因为:抽象类就是作为一种模板让子类在继承的时候遵守这个模板的,如果声明成了final的话,如何实现继承呢?
7、 abstract 不能与private、static、final或native并列修饰同一个方法。因为:抽象类其实是在程序设计的角度出发,抽象方法其实就是子类必须遵守的行为准则,用private修饰后,子类无法继承,又如何遵守呢?static修饰的方法属于类,不符合规范;final修饰后,方法被锁定,以防任何继承类修改它的含义,同时final方法转为内嵌调用,那子类又该如何重写方法覆盖掉呢?对吧,这样就无法按照父类的规范编写子类必须实现的方法。
举例说明:
运行结果:
二:接口
1.接口是一种比抽象类更加抽象的标准。我们需要明确一点就是,接口本身就不是类,我们不能实例化一个接口。如new Runnable();肯定是错误的,我们只能new它的实现类。
2. 接口是用来建立类与类之间的协议,它所提供的只是一种形式,而没有具体的实现。同时实现该接口的实现类必须要实现该接口的所有方法,通过使用implements关键字,他表示该类在遵循某个或某组特定的接口,同时也表示着“interface只是它的外貌,但是现在需要声明它是如何工作的”。
在使用接口过程中需要注意如下几个问题:
1、个Interface的方所有法访问权限自动被声明为public。确切的说只能为public,当然你可以显示的声明为protected、private,但是编译会出错!
2、接口中可以定义“成员变量”,或者说是不可变的常量,因为接口中的“成员变量”会自动变为为public static final。可以通过类命名直接访问:ImplementClass.name。
3、接口中不存在实现的方法。
4、实现接口的非抽象类必须要实现该接口的所有方法。抽象类可以不用实现。
5、不能使用new操作符实例化一个接口,但可以声明一个接口变量,该变量必须引用(refer to)一个实现该接口的类的对象。可以使用 instanceof 检查一个对象是否实现了某个特定的接口。例如:if(anObject instanceof Comparable){}。
6、在实现多接口的时候一定要避免方法名的重复。
举例说明:
引用:{
java接口本身默认是abstract的;可以是public的,也可以是friendly的,但不可以是private 的,不可以是protected的(否则通不过编译)。
java接口里的方法默认是abstract的,public 的;不可以private 的,不可以是protected 的。
详细分析参考自:
http://www.cnblogs.com/BaiLaowu/p/6618117.html