一、抽象类
如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类我们称它为抽象类。比如new Animal(),我们都知道这个是产生一个动物Animal对象,但是这个Animal具体长成什么样子我们并不知道,它没有一个具体动物的概念,所以他就是一个抽象类,需要一个具体的动物,如狗、猫来对它进行特定的描述,我们才知道它长成啥样。在面向对象领域由于抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能实例化的。
在使用抽象类时需要注意几点:
1、抽象类不能被实例化,也就是不能new出来对象,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可。
2、抽象方法必须由子类来进行重写。
3、只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含有其他方法。
4、抽象类中可以包含具体的方法,当然也可以不包含抽象方法,抽象类是包含了构造方法,这和接口不同。
5、子类中的抽象方法不能与父类的抽象方法同名。
6、abstract不能与final并列修饰同一个类。
7、abstract 不能与private、static、final或native并列修饰同一个方法。
二、接口
接口(Interface),在Java编程语言中是一个抽象类型,是抽象方法的集合。接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。如果一个类只由抽象方法和全局常量组成,那么这种情况下不会将其定义为一个抽象类。只会定义为一个接口,所以接口严格的来讲属于一个特殊的类,而这个类里面只有抽象方法和全局常量,就连构造方法也没有。
下面要注意的几点:
1、和抽象类不用,接口只有抽象方法和全局常量,没有构造方法
2、接口必须要有子类(如果不是抽象类),那么必须要覆写接口中的全部抽象方法,而且这些方法只能是public的
3、子类可以使用implements关键字实现多个接口。若既要继承抽象类,同时还要实现接口的话,使用一下语法格式:
class 子类 [extends 父类] [implemetns 接口1,接口2,...] {}
4、对于接口的格式要求如下:
[权限修饰符] interface 接口名(extends 父接口1,父接口2......){
-常量定义 //总是默认加上public static final
-方法定义 //总是默认加上public abstract
}
5、接口不能创建实例,但是可以用来申明变量类型
下面就通过一些例子来解释上面的这些要求:
public class Test_abstract_interface {
}
interface jiekouA{
/*默认加上 public static final*/int a = 10;
/*默认加上 public abstract*/void aaa();
}
interface jiekouB{
void bbb();
}
interface jiekouC extends jiekouA,jiekouB{
void ccc();
}
class Test01 extends Test_abstract_interface implements jiekouC{
//注意到下面会把重写所有的抽象方法
int b ;
public void aaa() {
}
public void bbb() {
}
public void ccc() {
}
}
public static void main(String[] args) {
/*jiekouA s = new jiekouA()-->这个是错误的调用方法,它只能new出子类*/
jiekouA s = new Test01(); //接口可以作为申明的变量
/*s.b = 10;*-->这个不行的,因为申明的是jiekouA,它只认识jiekouA中的属性方法,并不能调用Test01中变量,
这和多态一样*/
}