我觉得Java中的接口是多余的,理由见内

inssuc 2005-11-14 03:07:55
大家好,我是个编程新手,自信但理智,写个比较吸引人的题目,主要希望能吸引到高手指导一下:)

我对java不是很了解,但是这样一个面向对象的语言应该可以实现聚合吧,将一个已有的对象在新定义的对象中不通过继承重复使用,在PHP4中似乎可以这样实现:

class A{
...
function func_a(){
...
}
}

class B{
var $a;
function B(&$a){
$this->a=$a;
}
...
}

$b=new B(new A());
$b->a->func_a()


我想Java中应该也有这样类似的方法吧,如果的确是这样,我就很纳闷接口这个东西是不是有点多余,据我了解,很多人认为接口能和抽象类同时存在的原因是因为调用接口的类可能已经继承了其他的类而java中又不允许多重继承,可是,这个问题完全可以通过在类中直接调用由抽象类生成的具体类来实现啊,而且,在我看来,把接口的具体实现放在其他的类中不如先把它实现了,在放入需要它的类中好,那样不是违反了最少知识原理了吗?

因为刚学这些,有很多地方不懂,这些仅仅是我从目前掌握的知识产生出的疑问,接口可能有比我理解的更深的含义,如果是这样,能不能麻烦高手点拨一下,指出我理解上的错误,或是没有了解需要了解的东西? 在这谢谢大家了~!!
...全文
1405 54 打赏 收藏 转发到动态 举报
写回复
用AI写文章
54 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjdawu 2005-11-21
  • 打赏
  • 举报
回复
设计不好的系统,接口也会改来改去的
crazycy 2005-11-21
  • 打赏
  • 举报
回复
我就很纳闷接口这个东西是不是有点多余,据我了解,很多人认为接口能和抽象类同时存在的原因
====================================
接口可以减少类间的耦合度;比如说我表现层可以只操作业务操作的接口,而业务逻辑发生变化时,表现层的一切都不会影响;在这个地方,接口的价值就体现了;

而且,现在的Spring等无不体现着Java“面向接口编程”,而不应该是“面向实现编程”
ukulele8656 2005-11-20
  • 打赏
  • 举报
回复
看来半天

其实还是建议楼主好好动手做个"接口"的实验

感受一下"多态"的魅力
ukulele8656 2005-11-20
  • 打赏
  • 举报
回复
强帖留名

先顶后看
littlev19 2005-11-20
  • 打赏
  • 举报
回复
贴子太长了看着也累.但学到一点,多看看java api,especially java.util
zouxinfox 2005-11-20
  • 打赏
  • 举报
回复
经典。
wangzk0206 2005-11-19
  • 打赏
  • 举报
回复
你可以看看设计模式方面的书籍就可以知道接口还是很有用的。。。。
kafeiwu 2005-11-19
  • 打赏
  • 举报
回复
“interface”(接口)关键字使抽象的概念更深入了一层。我们可将其想象为一个“纯”抽象类。它允许创建者规定一个类的基本形式:方法名、自变量列表以及返回类型,但不规定方法主体。接口也包含了基本数据类型的数据成员,但它们都默认为static和final。接口只提供一种形式,并不提供实施的细节。
接口这样描述自己:“对于实现我的所有类,看起来都应该象我现在这个样子”。因此,采用了一个特定接口的所有代码都知道对于那个接口可能会调用什么方法。这便是接口的全部含义。所以我们常把接口用于建立类和类之间的一个“协议”。有些面向对象的程序设计语言采用了一个名为“protocol”(协议)的关键字,它做的便是与接口相同的事情。
为创建一个接口,请使用interface关键字,而不要用class。与类相似,我们可在interface关键字的前面增加一个public关键字(但只有接口定义于同名的一个文件内);或者将其省略,营造一种“友好的”状态。
为了生成与一个特定的接口(或一组接口)相符的类,要使用implements(实现)关键字。我们要表达的意思是“接口看起来就象那个样子,这儿是它具体的工作细节”。除这些之外,我们其他的工作都与继承极为相似。下面是乐器例子的示意图:

具体实现了一个接口以后,就获得了一个普通的类,可用标准方式对其进行扩展。
可决定将一个接口中的方法声明明确定义为“public”。但即便不明确定义,它们也会默认为public。所以在实现一个接口的时候,来自接口的方法必须定义成public。否则的话,它们会默认为“友好的”,而且会限制我们在继承过程中对一个方法的访问——Java编译器不允许我们那样做。
在Instrument例子的修改版本中,大家可明确地看出这一点。注意接口中的每个方法都严格地是一个声明,它是编译器唯一允许的。除此以外,Instrument5中没有一个方法被声明为public,但它们都会自动获得public属性。如下所示:

//: Music5.java
// Interfaces
import java.util.*;

interface Instrument5 {
// Compile-time constant:
int i = 5; // static & final
// Cannot have method definitions:
void play(); // Automatically public
String what();
void adjust();
}

class Wind5 implements Instrument5 {
public void play() {
System.out.println("Wind5.play()");
}
public String what() { return "Wind5"; }
public void adjust() {}
}

class Percussion5 implements Instrument5 {
public void play() {
System.out.println("Percussion5.play()");
}
public String what() { return "Percussion5"; }
public void adjust() {}
}

class Stringed5 implements Instrument5 {
public void play() {
System.out.println("Stringed5.play()");
}
public String what() { return "Stringed5"; }
public void adjust() {}
}

class Brass5 extends Wind5 {
public void play() {
System.out.println("Brass5.play()");
}
public void adjust() {
System.out.println("Brass5.adjust()");
}
}

class Woodwind5 extends Wind5 {
public void play() {
System.out.println("Woodwind5.play()");
}
public String what() { return "Woodwind5"; }
}

public class Music5 {
// Doesn't care about type, so new types
// added to the system still work right:
static void tune(Instrument5 i) {
// ...
i.play();
}
static void tuneAll(Instrument5[] e) {
for(int i = 0; i < e.length; i++)
tune(e[i]);
}
public static void main(String[] args) {
Instrument5[] orchestra = new Instrument5[5];
int i = 0;
// Upcasting during addition to the array:
orchestra[i++] = new Wind5();
orchestra[i++] = new Percussion5();
orchestra[i++] = new Stringed5();
orchestra[i++] = new Brass5();
orchestra[i++] = new Woodwind5();
tuneAll(orchestra);
}
} ///:~

代码剩余的部分按相同的方式工作。我们可以自由决定上溯造型到一个名为Instrument5的“普通”类,一个名为Instrument5的“抽象”类,或者一个名为Instrument5的“接口”。所有行为都是相同的。事实上,我们在tune()方法中可以发现没有任何证据显示Instrument5到底是个“普通”类、“抽象”类还是一个“接口”。这是做是故意的:每种方法都使程序员能对对象的创建与使用进行不同的控制。
mingr6370 2005-11-19
  • 打赏
  • 举报
回复
呵呵,记录一下
tramp73 2005-11-19
  • 打赏
  • 举报
回复
人气挺旺的哈,贴子我没看完,不知道有没有重复的.我来形象一下:

接口就好像电器厂商生产的插线板插座接口,以后别的电线生产商想要用,就必须生产一个和插线板对应的插头,管你生产的电线多漂亮多有创意,只要符合标准就能用,不符合标准就自觉点闪远
zouxinfox 2005-11-18
  • 打赏
  • 举报
回复
up!!!!!!!!!!!!!!!!!!
饿鱼骨头 2005-11-16
  • 打赏
  • 举报
回复
回复人: shine333(enihs) ( ) 信誉:115
老兄,本身理解深刻,再加上例子取得好。天生一副做培训师的料啊。
acp05dl 2005-11-16
  • 打赏
  • 举报
回复
对了,补充一句,大家都知道openGL,那个3d图形数据库,jogl,也就是openGL的java绑定,也是需要用到接口来实现的,我觉得gui应该是他的基础知识。对了,顺便问一句,谁知道哪能找到jogl的中文教程?谢谢!
acp05dl 2005-11-16
  • 打赏
  • 举报
回复
接口作为java语言对多继承的补充,因为在java里,类与类之间只能单继承,即一个子类只有一个父类,而通过接口就可以实现继承多个类了,这里应该叫“实现”一个类可以实现几个接口
例如,
public class MyApplet implements Runnable,MouseListener{
.......
}
据我所知,在java GUI 这块,是经常用到的,特别是在执行事件的时候。
leweizhen 2005-11-16
  • 打赏
  • 举报
回复
向shine333表示敬佩
yanxiazhiqiu 2005-11-15
  • 打赏
  • 举报
回复
mark
jordan1 2005-11-15
  • 打赏
  • 举报
回复
mark
taoyuming 2005-11-15
  • 打赏
  • 举报
回复
JAVA是面向对象的,在JAVA里可以说"一切都是对象". 对象都会有属性和行为,一些对象的类似行为和属性可以抽象为接口.就是把一些共性的东西放在接口里. 不知道我的理解对不对.
cling330 2005-11-15
  • 打赏
  • 举报
回复
shine333(enihs) 老兄讲的相当好、而且文采也不错。在下在学习中、忍不住支持一下
yexichang 2005-11-15
  • 打赏
  • 举报
回复
shine333(enihs) 讲的很深刻
加载更多回复(34)

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧