抽象类与接口的用途区别 抽象类与接口的用途就不用解释了,但有个问题:既然有接口了,为何还要用抽象类呢?我见到JDK源码中有很多最顶层的父类都是抽象类,什么情况下,是用接口实现不了的,一定要用抽象类才能实现的呢?希望有高手举个例子。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 interface没有 提供任何的 方法体,是一中纯粹的抽象类。还有,一个类可以implements多个ingerface,却只可以extends一个class 接口不能有成员的,只能存在方法。换句话说,实现接口只是实现了类的行为动作,没有实现类的属性。???是这样的吗? 我认为上面的观点有点问题! 接口定义的时候内部是可以有成员数据的,只是成员方法是抽象的,可以在继承的时候加以实现!----------------------------------------------------------------------接口中的属性必须是final的,所以不能被继承!!! 我回复一下上面的人说的几点观点:1 接口内可以有成员,凡是接口内声明的变量,就算不用任何修饰符,都默认是public stastic final的。2 人人都说接口可以多继承,人云亦云,其实根本没理解好继承的真正意义。反问一句,用接口能实现多态形性吗?建议去看看基础书,了解什么叫多态,什么叫继承。只有amandag(高歌) 的比喻有点启发。注意,其实我的问题是“什么情况下,是用接口实现不了的,一定要用抽象类才能实现的呢?”,我问的是实际应用问题。希望有人举出个例子。 接口不能有成员的,只能存在方法。换句话说,实现接口只是实现了类的行为动作,没有实现类的属性。-------这个显然是错的!注意,其实我的问题是“什么情况下,是用接口实现不了的,一定要用抽象类才能实现的呢?”,我问的是实际应用问题。希望有人举出个例子。-------关于这个,其实全部用接口也不是不可以,但是如果全部用接口,那么所有的继承类都将自己实现所有的方法,这个有时候是不必要的,将大大的增加程序员的工作量以及设计上的错误比如有个接口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!")};//如果不小心还有可能两个打印不同的东西} 所以可以看到java api很多类顶层只是一个抽象类而不是接口,比如Object每个类都是继承Object,如果Object是一个接口,想想你自己写的类将要实现多少在Object里面定义的方法?没有这个必要了还有一个很好的例子是MouseListener跟MouseAdapter,前者是接口,后者是抽象类,该抽象类是继承MouseListener,并且所有方法体为空,在具体应用上,由于implements MouseListener将必须实现所有的方法,有时候可能并不需要,可能只需要相应一个mouseClicked事件就够了,其他事件不用管,这时候你只需要extends MouseAdapter,然后overridemouseClicked方法即可,这个就是很好的应用了,不用全部实现接口的所有方法 声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。 很谢谢believefym的详细解释,说到点子上了。但我还是有个问题想请教,引用:由于implements MouseListener将必须实现所有的方法,有时候可能并不需要,可能只需要相应一个mouseClicked事件就够了,其他事件不用管,这时候你只需要extends MouseAdapter,然后overridemouseClicked方法即可,这个就是很好的应用了,不用全部实现接口的所有方法MouseAdapter为何要是抽象类呢,如果是一个普通类也可以实现上面所说的呀。 MouseAdapter为何要是抽象类呢,如果是一个普通类也可以实现上面所说的呀。-------------如果你没声明一个类为abstract的,也就认为该类可以被实例化,但是很多情况下抽象出来的类没有实例化的意义,比如MouseAdapter,根本没有实例化的意义,尽管它没有任何的抽象方法,当然如果MouseAdapter也完全可以不是abstract的,但是new MouseAdapter()是毫无意义的,这种情况还是加个abstract为秒 Java泛型方法与静态泛型方法的区别? 关于BufferWriter的问题 java机制修改.bat内容 在线等待:这个类偶在JSP里不会调用了,求肋。。。。(这是个加密的类) jdk1.5问题 有一段代码看不懂,请大家帮忙看一看.(初学者) 数据库关闭问题?谁能给出令人信服的说明 如何在winme下使用j2sdk1.3? \\.任意字符匹配问题 Linix下的Tomcat,为什么我的Applet找不到?在Windows环境下运行正常的,是我的路径问题,还是Tomcat 的设置问题? 请问在java applet 中怎么接收和处理windows消息? CVSNT2.5.03配置的问题?
却只可以extends一个class
----------------------------------------------------------------------接口中的属性必须是final的,所以不能被继承!!!
1 接口内可以有成员,凡是接口内声明的变量,就算不用任何修饰符,都默认是public stastic final的。2 人人都说接口可以多继承,人云亦云,其实根本没理解好继承的真正意义。反问一句,用接口能实现多态形性吗?建议去看看基础书,了解什么叫多态,什么叫继承。只有amandag(高歌) 的比喻有点启发。注意,其实我的问题是“什么情况下,是用接口实现不了的,一定要用抽象类才能实现的呢?”,我问的是实际应用问题。希望有人举出个例子。
-------
这个显然是错的!注意,其实我的问题是“什么情况下,是用接口实现不了的,一定要用抽象类才能实现的呢?”,我问的是实际应用问题。希望有人举出个例子。
-------
关于这个,其实全部用接口也不是不可以,但是如果全部用接口,那么所有的继承类都将自己实现所有的方法,这个有时候是不必要的,将大大的增加程序员的工作量以及设计上的错误
比如有个接口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!")};//如果不小心还有可能两个打印不同的东西
}
每个类都是继承Object,如果Object是一个接口,想想你自己写的类将要实现多少在Object里面定义的方法?没有这个必要了
还有一个很好的例子是MouseListener跟MouseAdapter,前者是接口,后者是抽象类,该抽象类是继承MouseListener,并且所有方法体为空,在具体应用上,由于implements MouseListener将必须实现所有的方法,有时候可能并不需要,可能只需要相应一个mouseClicked事件就够了,其他事件不用管,这时候你只需要extends MouseAdapter,然后overridemouseClicked方法即可,这个就是很好的应用了,不用全部实现接口的所有方法
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
MouseAdapter为何要是抽象类呢,如果是一个普通类也可以实现上面所说的呀。
-------------
如果你没声明一个类为abstract的,也就认为该类可以被实例化,但是很多情况下抽象出来的类没有实例化的意义,比如MouseAdapter,根本没有实例化的意义,尽管它没有任何的抽象方法,当然如果MouseAdapter也完全可以不是abstract的,但是new MouseAdapter()是毫无意义的,这种情况还是加个abstract为秒