黑马程序员技术交流社区
标题:
抽象类和接口
[打印本页]
作者:
张文兵
时间:
2012-6-10 02:09
标题:
抽象类和接口
对于抽象类和接口还是有点不明白,接口到底有什么作用啊?书上说的是:接口的设计目的是为了让类不必受限与单一继承的关系,而可以灵活的同时继承一些公有的特性,从而达到多重继承的目的。我有点不明白,实现一个接口必须要实现里面所有的方法,但是我也可以不去实现这个接口,自己在类中直接实现相应的方法,这样做和implements一个接口有什么不一样啊?接口到底有什么作用啊?
作者:
江南
时间:
2012-6-10 02:34
继承就是把共性内容不断向上抽取而来的,例如你老爸有100万,这时候你要用你就不用去挣100万了直接从老爸那里继承过来! 而接口呢就类似你老爸这里有个挣钱的方法,而你又比较独立然后自己根据老爸给你的挣钱方法去挣这100万
按照我的理解可能会给你增加更多的困惑,这是毕向东老师的总结的文档,希望你看了会更了解
面向对象的第二特征:
继承:
好处:
1,提高了代码的复用性。
2,让类与类之间产生了关系。有了这个关系才有了多态的出现。
java只支持单继承,不支持多继承(其实java保留了多继承机制,
但是多继承容易出现问题,用另一种方式来体现--多实现)。
java支持多层继承。
其实就是一个继承体系。
继承体系何来?其实都是通过对事物的分析,将共性内容不断向上抽取而来的。
想要对一个继承体系的功能进行使用时,可以参考一个技巧。
查阅顶层父类中的方法。因为这里的方法都是共性方法。
建立该体系中最子类的对象。
如果需要使用子类特有方法时,才需要查看子类的方法。
什么时候定义继承呢?
当类与类之间存在所属(is a)关系时,就可以定义继承。
如何判断所属关系呢?一个类是否可以获取到另一个类中所有的内容,如果可以,那么可以继承。
class DemoA
{
void showA(){}
void showB(){}
void showC(){}
}
//DemoB中也有一个showC()方法。那么DemoA中已经定义好了,可不可以直接继承过来用呢?
//很遗憾,showA(),showB(),并不是适合DemoB,也就是DemoB中不可以有showA(),showB()
class DemoB
{
void showC(){}
void showD(){}
}
//虽然DemoB不可以继承DemoA,但是发现他们有共性方法。那么可以继续向上抽取。
class Demo
{
void showC(){}
}
class DemoA extends Demo
{
void showA(){}
void showB(){}
}
class DemoB extends Demo
{
void showD(){}
}
接口:
特点:
1,接口用于功能的扩展。
2,接口其实就是对外暴露的规则。
3,接口的出现降低了藕合性。
比如:笔记本usb接口,主板的pci接口。mp3,手机,插排。
好处:
接口的出现,保留了多继承的机制,用多实现来表示。
而且接口可以多继承接口。
一个类在继承一个类的同时,可以实现多个接口。
代码规则:
使用interface关键字定义的。编译后生成的是.class文件。
接口中通常的成员:常量。抽象方法。
而且这些成员的有固定的修饰符。
常量:public static final。
方法:public abstract
interface Demo
{
int x= 3;
void show();.//不些这些固定修饰符,系统会自动加上。
}
但是要注意,复写接口中的方法的时候,一定要加上public。
类与接口之间是实现关系implements。
一个类必须实现接口中所有的方法后,才可以被实例化,否则该类还是一个抽象类。
----------------------------------------
抽象类和接口的不同。
学员示例。
abstract class XueYuan
{
public void sleep()
{}
public abstract void study();
}
interface Play
{
void play();
}
class Zhangsan extends XuYuan implements Play
{
public void study(){}
public void play(){}
}
问题领域。在分析事物时,值考虑该事物领域内的内容。
那么对于打球方法,并不是该领域的基本方法。这时把该功能扩展出去。通过接口来完成。
球员示例。
abstract class QiuYuan
{
abstract void play();
}
interface Study
{
void study();
}
class Wangwu extends QiuYuan implements Study
{
void play(){}
void study(){}
}
接口的应用:
编写一个项目,该项目应用到了数据库(mysql)
到了后期,软件有了新的需求,使用Oracle数据库。
对数据库的操作常见的四种操作,增 删 改 查。
class SqlOperate
{
public void add()
{
mysql code;
}
public void del()
{
mysql code;
}
}
换成oracle就需要该动SqlOperate该类中的方法内容。
后期维护不建议该动代码,灾难。
在前期分析的时候,就应该考虑到这样需求。
为了后期扩展方便,留有扩展余地,进行功能的扩展。
interface SqlDao
{
public void add();
public void del();
}
class MySqlOperate implements SqlDao
{
public void add()
{
mysql code;
}
public void del()
{
mysql code;
}
}
到了后期变成oracle时,
只需要在定义一个类去重新实现接口即可。
class OracleSqlOperate implements SqlDao
{
public void add()
{
Oracle code;
}
public void del()
{
Oracle code;
}
作者:
杨天皓
时间:
2012-6-10 02:47
这是因为在JAVA中只允许单继承,也就是说,一个类只能继承自一个父类。这样虽然有安全上的考虑,可是问题出来了,现实世界中有很多东西并不是用简单的单继承就可以解决的,比如,我们继承了父亲的基因,但是也继承了母亲的基因。如果在JAVA中只有抽象类,这种情况是无法解决的。所以JAVA提出了这个接口的概念。简单举个例子:所谓接口,相当于电源插座,可插入构件相当于电器。可插入构件的关键在于存在一个公用的接口,以及每个构件都实现了这个接口。如果没有这个接口,那岂不是每一个电器都要自备一个接口才能使用了?
作者:
黄捷
时间:
2012-6-10 08:29
Java封装性比较高,用接口实现多继承第一个是安全方面的考虑,另一个是帮你把减少代码量。早就封装好的类为什么不直接用呢?非要自己去定义。Java最大的好处就是高集成性,高封装性
作者:
何志文
时间:
2012-6-10 08:54
抽象类是能有具体的方法,接口全是抽象的。。
先说接口好处。
好比USB接口。电脑的USB接口什么能键盘和鼠标等。。看下面
USB i=new 键盘();
USB i=new 鼠标();
抽象的好处。。。。
是为了代码的复用
只能说这么多。。我也是新手。。
是不是方便多了。不能键盘去打键盘的,鼠标去找鼠标的。
作者:
郑文博
时间:
2012-6-10 09:43
抽象类和接口异同:
相同:
1,都可以在内部定义抽象方法。
2,通常都在顶层。
3,都不可以实例化,都需要子类来实现。
不同点:
1,抽象类中可以定义抽象方法和非抽象方法,
而接口中只能定义抽象方法。
2,接口的出现可以多实现。
抽象类只能单继承。
也就是说:接口的出现避免了单继承的局限性。
3,继承和实现的关系不一致。继承:is a,实现:like a
综上所述:
如果你想定义的方法全部都是抽象方法那么用接口,否则用抽象类.
而且接口可以多实现,对类的单继承进行了改良.
作者:
朝哥
时间:
2012-6-10 10:34
用接口的最大原因是
开发这个语言的sun公司就是这么定义的,你不实现就会报错。而且
接口给子类提供必须实现的方法,主要是起
规范
作用。
打个比方,一个国家应该不需要宪法吧,自己本地创建自己的法律不就完事了?
为什么非要有宪法了,因为宪法就是一种规范,你们地方创建自己的法律必须以宪法为基准。否则就乱套了。
作者:
徐炯
时间:
2012-6-10 10:43
楼上的回答都很好,我来补充点.
java是面向对象的编程语言,它设计接口和抽象类的目的就是为了更安全更有效的描述对象。
我们在设计开发的时候,有个原则,把变化的部分和不变化的部分区分开来(策略模式常用),
变化的部分一般用接口(相对较多),不变的部分用抽象类,这样做的好处是,
子类对象可以任意复写父类(抽象类)方法,而不用担心父类中的方法发生变化,
在设计抽象类的时候也不用考虑以后代码的更改,若要更改代码则只需增删接口代码即可,因为java支持多实现。
作者:
武剑峰
时间:
2012-6-10 10:55
接口其实是个规定,如果一个类实现了接口,别人就知道肯定有其方法,方便他人和自己调用,你自己写方法的话,除非看了代码否则无法得知,其实这是更方便team 编程
来自:黑马程序员训练营论坛 Android客户端
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2