对java接口和抽象类的理解与区别

来源:互联网 发布:希尔伯特曲线 python 编辑:程序博客网 时间:2024/04/29 21:45

我是一个java初学者

--------------------------------------------------------------------------java接口环节,show time~------------------------------------------------------------------------

说道接口,不得不提一嘴抽象类,因为抽象类和接口很容易弄混,因为他们很像

百度一下抽象类与接口的区别: 

首先还是要说一下面向对象的思想!java是面向对象的编程,面向对象的编程中,抽象是它的一大特征。在java中,可以用两种形式来体现OOP(Object Oriented Programming,OOP,面向对象程序设计)的抽象——接口和抽象类。

那么来说抽象类:

在了解抽象类之前,先要了解抽象方法,抽象方法是只有方法声明,而没有具体的实现。抽象方法的声明格式:abstract  void  fun();

抽象方法必须用abstract关键字进行修饰。如果一个类里面“含有”抽象方法,那么称这个类为抽象类,抽象类“必须”在类前使用关键字进行修饰:

public abstract class ClassName{

      sbstract void fun();

}

抽象类中含有无具体实现的方法(抽象方法),所以不可以用抽象类来创建对象。从这里可以看出,抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在这个父类中实现出来没有任何意义,并且这个方法必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个父类类也就成为abstract(抽象)类了。

包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类相同点就是,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:

1)抽象方法必须为public或者protected(因为private不能被子类继承,所以实现不了其内的方法),缺省(理解成默认即可)情况下默认为public。

2)抽象类不能用来创建对象(上面提到了,是因为抽象类中含有无具体实现的方法)

3)如果一个子类继承一个父类(抽象类),那么子类就必须实现父类的抽象方法,如果没有实现父类的所有抽象方法,那么该子类也应该被定义为抽象类,在其他方面,抽象类和普通类没什么区别。


接下来说一下接口

接口英称作interface是,在软件工程中,接口泛指供别人调用的方法或函数。可以理解这记者的初衷,接口是对行为的抽象。在java中定义一个接口的行为如下:

public interface InterfaceName{

}

接口中可以含有 变量 和 方法。但是需要注意的是,接口中的变量会被隐式的指定为public static final变量(并且只用public static final 变量,用private修饰会报编译错误)。而方法会被隐式的指定为public abstract方法(而且只能是用public abstract修饰 ,用其他的关键字,如:private protect final等修饰,用其他的修饰会报编译错误),并且接口中所有的方法都不能有具体的实现,也就是说,接口中的所有方法都需要是抽象方法。从这里可以隐约的看出,接口和抽象类的区别,接口比抽象类更加“抽象”,而且一边不在接口中定义变量。

要让一个类遵循某组接口,需要使用implements关键字,具体格式如下:

class ClassName implements Interface1,Interface2,Interface3。。。。{

}

可以看出,一个类可以遵循多个特定的接口,同时根据抽象类和普通类的区别,一个普通类可以遵循接口,但是要实现接口里面的所有抽象方法,然而抽象类实现接口不必实现接口里面的所有抽象方法。


总结一下抽象类和接口的区别:

1.语法层面上的区别:

1)抽象类里面可以有成员“方法”的实现细节,接口里面的“方法”只能有public abstract方法;

2)抽象类里面可以有各种类型的成员变量,接口里面的成员变量只能是public static final;

3)抽象类中可以由静态代码块和静态方法,接口里面不能有静态代码块和静态方法;

4)一个类只能继承一个抽象类,但是一个类可以实现多个接口;

2.设计层面上的区别:

1)抽象类是对事物的抽象,即对类的抽象;而接口是对行为的抽象。抽象类是对类的整体进行抽象(属性,行为等),而接口是对类的局部(行为)进行抽象举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将飞机设计为一个类Airplane,将鸟设计为一个类Bird,但是不能将 飞行 这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将 飞行 设计为一个接口Fly,包含方法fly( ),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。然后至于有不同种类的飞机,比如战斗机、民用飞机等直接继承Airplane即可,对于鸟也是类似的,不同种类的鸟直接继承Bird类即可。从这里可以看出,继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。

2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式的设计。而接口是一种行为规范,是一种辐射式的设计。2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。什么是模板式设计?最简单例子,大家都用过ppt里面的模板,如果用模板A设计了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它们的公共部分需要改动,则只需要改动模板A就可以了,不需要重新对ppt B和ppt C进行改动。而辐射式设计,比如某个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。


参考:http://www.cnblogs.com/dolphin0520/p/3811437.html,感谢海子,虽然你不知道,哈哈`

--------------------------------------------------------------------------------------------show   over-----------------------------------------------------------------------------------------------------------------------






0 0
原创粉丝点击