而具体类是一定要实现的。因为作为一个具体类X,它既然声称实现了接口I,那就是说在所有需要一个I类型的引用的时候,我们都可以放一个X类型的对象上去(原因就是X声称它已经实现了接口A),比如: I i = new X(); 但假如I接口有一个方法f(),X类并没有提供它的实现,那么,对于上面这个i,如果要调用: i.f(); 的话,会出现什么问题呢?说了半天,感觉越说越不对劲,好像自己是在用定理来证明公理。楼主应该是钻牛角尖了。 通常一种语言的语法是根据它想要实现的目的来制定的,上面的之所有有问题,就是因为JAVA既然要支持面向接口编程,必须这样规定语法。否则,如果我们写程序的时候,每次从接口上调用一个方法的时候,还要先检测一下: if(i.IsImplemented(i.f)) 那就像前面某位朋友说的,要接口还有啥用啊?直接从Object上进行检测不就得了?总归所有的类都从Object继承来的。 而且如果检测失败了怎么办?抛出异常?何必呢?——自己写一们半垃子类,就是为了让别人抛异常。
比如实现接口Car的对象都可以run(), 你就必须要提供run()方法。你要是不提供,那就不是Car接口的实现了
如果可以不实现接口中的所有方法,那就失去了接口的意义了。
--------------------
接口的意义在于它的高度抽度,可以让代码更好的得到重用性.可是这种回答似乎又与我的问题不相符.
烦请各位gs解答.
如果可以只实现接口中的部份方法,这样在用户在使用时候的灵活性不是更大。
同样也是可以实现多态的机制的。
I i = new X();
但假如I接口有一个方法f(),X类并没有提供它的实现,那么,对于上面这个i,如果要调用:
i.f();
的话,会出现什么问题呢?说了半天,感觉越说越不对劲,好像自己是在用定理来证明公理。楼主应该是钻牛角尖了。
通常一种语言的语法是根据它想要实现的目的来制定的,上面的之所有有问题,就是因为JAVA既然要支持面向接口编程,必须这样规定语法。否则,如果我们写程序的时候,每次从接口上调用一个方法的时候,还要先检测一下:
if(i.IsImplemented(i.f))
那就像前面某位朋友说的,要接口还有啥用啊?直接从Object上进行检测不就得了?总归所有的类都从Object继承来的。
而且如果检测失败了怎么办?抛出异常?何必呢?——自己写一们半垃子类,就是为了让别人抛异常。
//同样也是可以实现多态的机制的。——如果你经常发现某个类只需要实现某个接口中的一小部分方法就可以很有用了,那说明那个接口的设计有问题了,它太大了,它应该分成多个接口的。
——看看JAVA标准库中的接口,大多数只有一个方法,不超过3个的差不多占到90了,没仔细数过,感觉上的。
我想jvm现在已经可以检测出这样的问题了。
如果实现我说的只继承接口的一部份,而在用户调用的时候给出提示是没有任何问题的吧。
如果这样的实现,是否给我们的程序给出了更大的活灵性呢?
因为有的时候我们只是想用接口一部份方法,而不是全部。
也许有人说这是我们的设计不好导致的,可我想说,哪一个程序没有这样的问题呢?
我还没写完,steedhorse(晨星) 就已经说我们的设计有问题了。可除了jdk外,其它所有的程序或多或少的都会有一点这样的问题存在的吧。
有谁说的清楚呢??
——那肯定是要克服,我觉得。//上面的问题引出来运行时和编译时检查的问题。
//我想jvm现在已经可以检测出这样的问题了。
//如果实现我说的只继承接口的一部份,而在用户调用的时候给出提示是没有任何问题的吧。
//如果这样的实现,是否给我们的程序给出了更大的活灵性呢?
//因为有的时候我们只是想用接口一部份方法,而不是全部。
这个当然不能只依赖编译时检查,那样的话,软件开发将会变成一个噩梦。
你不能只考虑只有一个人,一家公司在写代码。有时候多个项目组需要合作,而且还可能用到N多其它公司的库,而且别的公司在开发它们的库的时候,咱们的公司可能还没成立,而且它们可能别有项目组,别有公司还可能定期升级它们的库。比如说A公司写了一个库,支持一种回调机制,你只要写一个实现了接口I的类X传给它,它就可以调用接口上的方法来完成一些功能,假如B公司在A公司发布了这套库之后才成立,现在B公司想用这套库里的功能,但它并不想实现接口I的全部接口,那这怎么办?让A公司再改个新版本出来?再举个更具体的例子,java.sql.DriverManager类有一个静态方法,它返回一个接口类型:Connection,这里的Connection的实现类肯定是别人写的,而且源代码不会公开出来,那么我们编程时,写到这里了:
Connection conn = DriverManager.getConnection(……);
下一步怎么办?——我现在还不知道Connection接口上的哪些方法被实现了,哪些方法没被实现,后面的的程序我怎么写啊?
或者我百般调试,小心翼翼的,终于有一天,我通过各种方法测出了所有已被实现的和未被实现的方法,于是,我忍辱负重,而且由于我水平高,仅仅用那些已经实现了的方法竟然也完成了任务
然后,有一天,那个做数据库的公司说它们的java驱动要升级了,这一次,它们决定去掉a,b方法的实现,而增添原来没有的实现的c,d,e方法的实现——555,我TM容易嘛我。。
这样就表示:“窗口最小化时,我的程序啥也不做”,而不是“窗口最小化时,我的程序发生未实现异场”——而后者也就等价于说:“我做梦也没想到窗口竟然还会被最小化。”至于刚才楼主说“可除了jdk外,其它所有的程序或多或少的都会有一点这样的问题存在的吧。”,那大言不惭的说,我写的接口就从来没有这种问题。因为一旦发现有太多这样的需求,我会把它做成基类或抽象基类,而不是接口。
这样在使用别人写的类时就不用提心吊胆,也不用不停地去翻文档,手册,它就是升级了我也不怕。除非它不再支持那个接口了——那样的话,我就发誓再不使用他们写的库了。
里面的方法默认都只能是public abstract的抽象方法
要是不实现它的所有方法 那么这个实现它的类也成为一个抽象类啦 就不能创建对象了
在C++版是晨星星星。
可能是有点专牛角尖了.
ps: 晚上结帐.
不如 不同的 人有不同的打领带的方法 ,所以要在实现的时候把具体的方法写出来 不过也有可能 interface里的方法太多了
有些不需要实现,可以用适配器模式
借个地方,请教:用接口实现vc中的多重继承如何实现??==================
——只能适当模拟,无法完全实现。
……
他用来约束你的行为。如果你实现他而不遵守他的规范那你实现的就是不是他这个接口!==================
同意,楼主还是没有理解什么是接口,当然也就无法想通为什么具体类就要全部实现接口的函数。要么就是“默认空实现”跟“完全不实现”两个概念没搞清。
去找本<core java> 看看
里面有详细的解释