深入java(类)抽象类和接口语法解答

来源:互联网 发布:一年的java工作经验 编辑:程序博客网 时间:2024/06/11 15:54

上一篇文章对象初始化,类构造函数的调用以及多态,这一篇文章继续到抽象类和接口,总结抽象类和接口的基础知识点,同时解答为何会有这些知识点,例如:为什么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

下一篇我们从设计的角度出发观察抽象类及接口