文档库 最新最全的文档下载
当前位置:文档库 › 抽象类和接口的区别

抽象类和接口的区别

抽象类和接口的区别
抽象类和接口的区别

分的好同学) 66%

楼主发表于:2006-05-24 23:53:01

抽象类与接口的用途就不用解释了,但有个问题:

既然有接口了,为何还要用抽象类呢?我见到JDK源码中有很多最顶层的父类都是抽象类,什么情况下,是用接

了的,一定要用抽象类才能实现的呢?希望有高手举个例子。

回复次数:16

#1楼得分:0回复于:2006-05-25 00:12:46

接口不能有成员的,只能存在方法。换句话说,实现接口只是实现了类的行为动作,没有实现类的属性。

#2楼得分:0回复于:2006-05-25 00:30:07

有默认行为(即是有基类函数实现)的接口

#3楼得分:0回复于:2006-05-25 00:38:54

interface没有提供任何的方法体,是一中纯粹的抽象类。

还有,一个类可以implements多个ingerface,

却只可以extends一个class

#4楼得分:5回复于:2006-05-25 08:22:36

抽象类:包括大多数派生类所具有的功能(具体实现类似)

接口:包括某些类(甚至不相关的类)所类似的功能(具体实现可以不同)

抽象类:家用电器

派生类:冰箱,洗衣机,电视,收音机...

接口:开关

实现接口的类:电视,收音机,水龙头,马桶...

#5楼得分:0回复于:2006-05-25 09:07:14

接口能够很好地实现多继承,也许这是接口存在的最大的好处吧

#6楼得分:0回复于:2006-05-25 09:10:12

接口不能有成员的,只能存在方法。换句话说,实现接口只是实现了类的行为动作,没有实现类的属性。

???是这样的吗?

我认为上面的观点有点问题!

接口定义的时候内部是可以有成员数据的,只是成员方法是抽象的,可以在继承的时候加以实现!

还有,接口是抽象类的一个特殊情况。接口的定义也是建立在抽象类的基础之上的。如果没有了抽象类的定

有接口,就想一棵树没有了根基一样!

#7楼得分:0回复于:2006-05-25 09:25:25

接口不能有成员的,只能存在方法。换句话说,实现接口只是实现了类的行为动作,没有实现类的属性。

???是这样的吗?

我认为上面的观点有点问题!

接口定义的时候内部是可以有成员数据的,只是成员方法是抽象的,可以在继承的时候加以实现!

----------------------------------------------------------------------

接口中的属性必须是final的,所以不能被继承!!!

分的好同学) #8楼得分:0回复于:2006-05-25 09:44:46

我回复一下上面的人说的几点观点:

1 接口内可以有成员,凡是接口内声明的变量,就算不用任何修饰符,都默认是public stastic final的。

2 人人都说接口可以多继承,人云亦云,其实根本没理解好继承的真正意义。反问一句,用接口能实现多态形性

去看看基础书,了解什么叫多态,什么叫继承。

只有amandag(高歌) 的比喻有点启发。

注意,其实我的问题是“什么情况下,是用接口实现不了的,一定要用抽象类才能实现的呢?”,我问的是实际应

希望有人举出个例子。

#9楼得分:0回复于:2006-05-25 10:03:28

楼主这么聪明,还需要别人来告诉你吗????

#10楼得分:0回复于:2006-05-25 10:16:04

接口不能有成员的,只能存在方法。换句话说,实现接口只是实现了类的行为动作,没有实现类的属性。

-------

这个显然是错的!

注意,其实我的问题是“什么情况下,是用接口实现不了的,一定要用抽象类才能实现的呢?”,我问的是实际应用

望有人举出个例子。

-------

关于这个,其实全部用接口也不是不可以,但是如果全部用接口,那么所有的继承类都将自己实现所有的方法,这

是不必要的,将大大的增加程序员的工作量以及设计上的错误比如有个接口Person,有个方法叫做sayHello,只是简单的打印一个sayHello(表示打个招呼吧),Person接口下子类SomeConcretePerson1,SomeConcretePerson,当然这两个子类也会继承这两个方法,但是由于是Person是接子类必须自己实现打印sayHello,这个明显会重复代码,何不在把Person改为抽象类,实现sayHello方法呢

abstract class Person{

sayHello(){System.out.println( "hello! ")};

}

SomeConcretePerson1 extends Person{};

SomeConcretePerson2 extends Person{};

------------------------------------

interface Person{

sayHello();

}

SomeConcretePerson1 extends Person{

sayHello(){System.out.println( "hello! ")};//这里明显跟下面是重复的代码

};

SomeConcretePerson2 extends Person{

sayHello(){System.out.println( "hello! ")};//如果不小心还有可能两个打印不同的东西

}

#11楼得分:0回复于:2006-05-25 10:28:07

所以可以看到java api很多类顶层只是一个抽象类而不是接口,比如Object 每个类都是继承Object,如果Object是一个接口,想想你自己写的类将要实现多少在Object里面定义的方法?没

要了

还有一个很好的例子是MouseListener跟MouseAdapter,前者是接口,后者是抽象类,该抽象类是继承MouseListen 所有方法体为空,在具体应用上,由于implements MouseListener将必须实现所有的方法,有时候可能并不需要,要相应一个mouseClicked事件就够了,其他事件不用管,这时候你只需要extends MouseAdapter,然后overridemou

方法即可,这个就是很好的应用了,不用全部实现接口的所有方法

开心生活!) #12楼得分:0回复于:2006-05-25 10:33:11

声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现

法。

接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。

所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了

#13楼得分:0回复于:2006-05-25 13:02:57

需要有默认行为,或者一些方法不需要子类一定实现的时候可以用抽象类.

分的好同学)

#14楼得分:0回复于:2006-05-25 13:41:35

很谢谢believefym的详细解释,说到点子上了。但我还是有个问题想请教,

引用:由于implements MouseListener将必须实现所有的方法,有时候可能并不需要,可能只需要相应一个mou 事件就够了,其他事件不用管,这时候你只需要extends MouseAdapter,然后overridemouseClicked方法即可,这

好的应用了,不用全部实现接口的所有方法

MouseAdapter为何要是抽象类呢,如果是一个普通类也可以实现上面所说的呀。

#15楼得分:25回复于:2006-05-26 10:44:47

MouseAdapter为何要是抽象类呢,如果是一个普通类也可以实现上面所说的呀。

-------------

如果你没声明一个类为abstract的,也就认为该类可以被实例化,但是很多情况下抽象出来的类没有实例化的意义ouseAdapter,根本没有实例化的意义,尽管它没有任何的抽象方法,当然如果MouseAdapter也完全可以不是abstr

是new MouseAdapter()是毫无意义的,这种情况还是加个abstract为秒

#16楼得分:0回复于:2006-05-29 10:34:18

楼上的确是高手,结贴

分的好同学)

相关文档
相关文档 最新文档