站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2EE 专题一个面试问题~ 至尽困惑着我..

一个面试问题~ 至尽困惑着我..

摘要: 一个面试问题~ 至尽困惑着我..


一次面试, 一顿寒暄后,开始进入JAVA正题,
考官问:虚类和接口区别是什么?
我答: 接口里方法都是抽象,成员都是静态,常量, 用implements实现; 而虚类里有方法是抽象,有方法是实现的,成员没有限制,用extends继承;

考官非常满意,接着问: 那你有没有想过,什么情况下用虚类,什么情况下接口?
刹那间,无从回答....
当时就开始回想我碰到过哪些接口, java.sql.Connection, ResultSet, PreparedStatement都是接口~ 但它们为什么是接口而不是虚类呢? 我想不出... 再想其他例子, EJB要实现的几个都是接口, 为什么不用虚类? 也想不出... 再想想自己做过的项目, 好象都是凭主观意识, 想做成接口就接口了,想做成虚类就虚类了...

至今,接口接口~ 到底什么是接口~,JAVA为什么要接口, 还是困惑着我...
有了虚类,为什么还需要接口??


看看....


很简单啊..接口主要是为了实现C++中多继承的类似功能啊..



楼上~ 说的没错~ 我学J2SE时,老师是这么说的....
但是你看看java.sql包下的那些接口~~ 你使用他们的时候,有想过要多重继承吗???

那些接口明显不是为了多重继承~


至少
封装是接口的一个重要功能


楼上~
是Class就有封装功能, 答案不合格


抽象类可以有它所有子类中一些方法的默认实现
和接口点有差别吧


对3楼的回答很无语``接口就是实现多重继承的吗?建议大家多看看设计模式,就知道接口的优势在什么地方了.
继承在很多场合中都不被提倡了.


java为什么会有接口?
接口不是为了封装,因为java已经有了更好的封装的技术,private,protected
接口最大的作用在于:把实现和定义分开,这样在进行主装的时候,就不需要考虑具体的实现,那么接口就可以任意组合
说到继承,继承只有一种情况下才考虑,就是需要上溯造型的时候。


恩~ 看了LY198196(李俊锋)的答案~
颇为同意!


一般情况下用接口,当需要给方法做定义的时候才用虚类
接口的一个重要用处就是实现C++中的多重继承和防止客户端程序员创建该类的对象



今天刚刚给学生讲了Java中接口的问题,写下来与大家分享:

在现实世界中有很多与接口等同的概念:

USB接口:数码相机实现了USB接口,电脑通过USB接口与数码相机交换数据(使用USB接口)
GUI(图形用户接口,也就是界面):
软件开发人员实现了GUI后面的功能,软件用户通过GUI使用软件的功能(使用GUI)

可见,接口帮助我们把实现与使用分开,再看看下面的程序:

interface I {
//接口中的方法都是抽象方法,接口是不能被实例化的
public int add(int m, int n); //接口中的方法只定义了能做什么,但没有定义怎么做
static int MAX = 100; //接口中还可以定义常量
}

//通过类G1实现了接口I,也就是把接口中的所有抽象方法进行了定义
class G1 implements I {
public int add(int m, int n){
int r = m+n;
return r;
}
}

//通过类G2使用接口I
class G2 {
//什么样的实际参数可以传给m(m是接口I类型的引用)?
//传过来的必须是实现了接口I的类G1类型的对象
public void f (I m ,int s, int t ){
int r = m.add(s,t);
System.out.println(r);
}
}

public class InterfaceTest {
public static void main(String [] args){
I x = new G1();
G2 y = new G2();
y.f(x,4,6); //x是接口I的实现类G1类型的对象
}
}

扩展:

CoreJava里面的重要接口:Comparator, Comparable,Collection, Set, List, Map, DataSource, Connection, Statement, ResultSet, PreparedStatement等。

在J2EE技术中接口也发挥着重要的作用,如Spring技术是基于接口的,EJB技术也是基于接口的。

----------------
BetterYou.com.cn


提倡面向接口的编程方法,这样可以降低耦合性,提升可维护性,可测试性


上楼的上楼 类G2的使用,长了见识。

有时候连接数据库的时候,我使用定义接口的方法来定义连接数据库所要使用的URL,Driver,User,Password。
而在类中把他们都定义成静态变量,使用的时候和用接口定义是一样的。
那这两种方法哪种更好?还是都不行呢?
尽管明白飞机和鸟都能飞,都有fly的方法,
但什么时候该用接口还真不清楚。




接口可以实现多继承
一个子类只能继承一个父类,但是可以有N多个接口


这个问题我认识的一个人也碰到过,确实很不好答,每个人的看法都不一样,可深可浅!


java是不支持c++中的多重继承的,要实现的话只能用借口了


有人说虚类是父亲,接口是老师,你可以有多个老师 但是只能由一个父亲


xiciliu,
你回复中提到的情况,在接口定义常量,或者在类中定义常量,
其实并没有什么本质的区别。

BetterYou.com.cn


接口可以实现多重继承,但不并代表用接口就一定要多重继承,设计一个类为接口或说是虚类不光考虑眼前,如果在不是很必要的情况下一开始就设计成虚类,那以后想多重继承的时候岂不是就傻眼了,而JDK里的设计正是这样一种考虑,由于他的广泛被使用性,所以在设计的时候尽量设计成接口.现代的开发标准里也一般不推荐使用虚类,除非有非常重要的方法需要在父类里实现,否则都应该设计成接口.


up


MARK


那你有没有想过,什么情况下用虚类,什么情况下接口?
为什么没有人讨论这个?


接口倾向于技术(比如COM),倾向于设计模式,把功能的实现独立出去
虚类倾向于多态,把功能的实现延迟
他们的方向不同


接口用于实现方式不定的情况下。目前所接触的接口都非常类似于协议,知道输入输出,具体实现由实现者确定。
虚类用于部分不定的情况。基于系统,有一部分具体的实现,还有一部分未定。这样既可以全部重写,也可以部分重写。
不从编程的角度考虑,只考虑需求和设计。


提倡程序中多用接口.但实际中用的最多还是抽像类.


接口倾向于定义一种规范。

比如 jdbc 绝大部分定义成接口,就是定义了规范,各数据库厂商都要安装这个规范来提供jdbc驱动程序。

接口离开了类,就什么都不是,只有依附于类,才能有作用。

抽象类则不然,从本质上,抽象类是“类”,只是这个类定义的尚不完整,一些抽象方法需针对具体情况,才能确定如何实现。


有一本书,是这样说的:

“接口是为了支持运行时动态方法解决而设计的,通常,为使一个方法可以在类间调用,两个类都必须出现在编译时间里,以便java编译器可以检查以确保方法调用是兼容的。这个需求导致了一个静态的不可扩展的类环境。在一个系统中不可避免会出现这类情况,函数在类层次中越堆越高,以至该机制可以为越来越多的子类可用。接口的设计避免了这个问题。它们把方法或方法系列的定义从类层次中分开。因为接口是在和类不同的层次中,与类层次无关的类实现相同的接口是可行的。这是实现接口的真正原因所在。”

“注意:接口增添了很多应用程序所需的功能。在一些其它语言(例如C++)中,这些应用程序通常借助于多重继承来完成。”


就算已经结了,我也要回答一下,呵呵。
接口将规范和实现分离。就是面对实际问题,首先要设计大体的解决方案,定义接口规范(参数和返回值类型等)和解决步骤,然后才是具体的实现。将复杂问题简单化抽象化,是接口的核心,由此带来的好处很多。设计模式里有几个总体规则,基本上都是和接口相关的,基本上所有的设计模式都和接口相关。


我也要 说两句.

上面多数讨论的是 有了接口或是虚类,才有什么样的特征、特点。
没有从问题层面回答,有什么样的条件和环境,才需要使用接口或虚类。

trumplet(检查) 引用的内容是从正面回答了问题。
但我还是没看明白为什么?


↑返回目录
前一篇: 一个真心想做程序员的应届毕业生!!求助!!
后一篇: EJB入门问题