首页 > 代码库 > 浅谈JAVA接口和抽象类

浅谈JAVA接口和抽象类

一、什么是抽象方法、抽象类

 

抽象方法:

1、背景(为什么要有抽象方法):有一些方法,一出生就是用来让别人继承重写使用的,自己完全没有去实现的必要,只用定义就可以了,于是JAVA里就专门将这种方法称为抽象方法。

2、定义:用abstract修饰符来声明一种方法,而且这种方法只有声明,没有实现。

例如:

public abstract test();//只做了声明,没有实现,连“{}”都不写。

 

抽象类:

1、背景:因为抽象方法是定义在类里面的,抽象方法是只有声明没有实现的方法,即是残缺不全的,于是JAVA中将这种有残缺不全方法的类,称为抽象类。

2、定义:和前面的抽象方法类似,JAVA中将这种生来就是为了让人继承的类,称为抽象类。

注意:1、抽象方法必须要是在抽象类里,但是抽象类里可以没有抽象方法。

     2、该抽象方法所在的类,必须是抽象类。

 

二、什么是接口

1、背景(为什么要有接口):JAVA内没有多重继承的概念,但是现实生活中的对象存在这种现象,所以就有了接口。

例如:"猫" 属于"动物",也属于“猫科"但是在JAVA里没有多重继承来描述,所以用接口来描述---->class Cat implements Animal,Felidae{}

2、定义:接口是抽象方法和常量值的定义的集合(接口里不能有变量接口里的方法都是抽象方法),它是一种特殊的抽象类

--->备注:(1)接口里声明的属性(成员变量)必须定义为public static final xx xx,就算你在接口里写成 int a,也默认被当成 int xx= public static final int xx。

     (2)接口里的方法只能是抽象方法,必须为public的,必须为抽象的,就算定义成 void methmod,也默认当成 void methmod = public abstract void methmod

 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

特别注意:以上规定是JAVA8之前的版本,但是在JAVA8之后的版本中,接口中可以有实例方法(public static void)、可以有默认方法(public default)。

为什么要更新这个特性,具体解释可以参考:http://www.cnblogs.com/jilodream/p/5786036.html

比如:

1、接口中的实例方法可以直接使用

public interface UserInterface{

  public static void methodStatic(){

  }

  public default methodDefault(){

  }

}

public class Test{

  UserInterface inter = new UserInterface();//可以把这个接口当做一般抽象类一样new一个实例

  inter.methodStatic;//直接调用它的静态方法

}

2、默认(default)方法,可以直接传递给实现该接口的类使用(Test类不实现该接口直接调用、Test类实现该接口后再调用、Test类实现接口后重写再调用)

public class Test{

  UserInterface.super.methodDefault;//不实现接口直接调用,注意需要使用"super."

}

ps:其他两种方式,这里就不举例了。

、相同点

1、接口也是类,她也有自己的成员变量和成员方法;

 

三、接口和抽象类的不同点

其实JAVA8版本之后,她两的区别已经不明显了(由上面的“特别注意”就可以发现)。

1、定义方式不同

类的定义:class Test{}

接口的定义:interface Inter{}

 

2、被使用的方式不同

类的继承:xx extends Test{}

接口的实现:xx implements Inter{}

PS:在使用的时候,最大的一个区别是,一个类可以同时实现多个接口-->xx implements Inter1,Inter2{}

 

3、内部属性不同

类的内部属性:没有做限制。

接口的内部属性:必须为public static final(即,成员变量必须是常量),而且接口是常量和抽象方法的集合(当然JAVA8之后,接口里也可以有实例方法和default方法)。

 

目前知道的就这么多,后面学习过程中有新的发现,再来补充~~~~

 

浅谈JAVA接口和抽象类