接口用于支持运行时的动态解析方法.通常,为了从一个类调用另一个类的方法,在编译时,两个类都需要申明,以便JAVA编译器能够进行检查方法申明是否兼容.这有利于静态类和不可扩展的类创建环境.这在一个与此类似的系统中,不可避免的会使类层次的功能越来越强,以至于越来越多的子类都可利用这种机制.但是接口可以避免这种问题,它把一个方法或一组方法的定义和类层次分开.由于接口和类位于不同的层次,所以按照类层次的术语,不相关的类可以实现同一个接口.以上书上的话
(1)不太通俗易懂.高手 能否详细 生动的解释一下.
(2)有抽象类,要接口到底有什么好处(上面一段话也涉及,还是不清晰)
(3)实现接口的类与该接口是否存在什么关系.
(1)不太通俗易懂.高手 能否详细 生动的解释一下.
(2)有抽象类,要接口到底有什么好处(上面一段话也涉及,还是不清晰)
(3)实现接口的类与该接口是否存在什么关系.
楼主【bx409027377】截止到2008-07-06 15:58:59的历史汇总数据(不包括此帖):
发帖的总数量:1 发帖的总分数:20
结贴的总数量:0 结贴的总分数:0
无满意结贴数:0 无满意结贴分:0
未结的帖子数:1 未结的总分数:20
结贴的百分比:0.00 % 结分的百分比:0.00 %
无满意结贴率:---------------------无满意结分率:---------------------
如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
{
public static final int aa=3;
public void hh();/*{
System.out.println("fdsfas");
}*/
}public class d implements Ikk
{
public void hh()
{
System.out.println("interface");
System.out.println("aa="+Ikk.aa);//访问方法1
}
public static void main(String args[])
{
d a=new d();
a.hh();
System.out.println(new d().aa);//访问方法2
}
}
{
public static final int aa=3;
public void hh();/*{
System.out.println("fdsfas");
}*/
}public class d implements Ikk
{
public void hh()
{
System.out.println("interface");
System.out.println("aa="+Ikk.aa); //访问方法一 直接用
}
public static void main(String args[])
{
d a=new d();
a.hh();
System.out.println(new d().aa); //访问方法二 实例化类引用
Ikk kk=new d();
System.out.println("aa= "+kk.aa); //访问方法三 通过接口引用访问实现
}
}
继承是一种is a的关系,它代表实现的类是一个什么东西。比如一个经理,他是一个雇员,可以写成Manager extends Employee。
接口是一种paly a roll as这样的关系,他代表一个类有什么功能。比如一个雇员,他可以有编程人员和美工的角色,可以写成A extends Employee implements Programmer, Artist。
他俩的语义不同。
这个是对楼主第二个问题的解答。其实二楼已经回答得差不多了。
对二楼的一些解释:
2.抽象类可以有实现,接口不能有实现,所以可以理解为借口比抽象类更抽象。
3.一个具体类需要实现接口中所有方法,不一定要实现抽象类里所有方法(实现抽象类里所有抽象方法)。接口不能有类成员变量。3楼的话会打消2楼积极性,不可取。从楼主的问题来看,还处于学习Java语言的阶段,建议做一些项目,然后进行重构,在重构中会发现一些道理,然后学习设计模式及架构模式,这样就能深刻理解抽象类和接口的关系。
这个aa在运行时放在内存静态区域里面。
实现接口其实某种程度上来说类似多重继承。
要说抽象类和接口的区别,我也不太清楚.自己身有体会的就是,我要用一个接口,就必须实现他里面所有的抽象方法.但通过继承抽象类则不同,我们用哪个方法就重写哪个方法就行了.就像加一个关闭窗口的监听器时,你用接口WindowListener和用抽象类WindowAdapter是不同的因为你只用windowClosing()方法
你在传递参数或返回值时,传入A,不如将A剥离共性抽象一个A接口出来灵活,抽象之后你可以随时替换传入的参数(只要实现了A接口),避免了大量的改动,返回值亦同。甚至很多模式的实现也离不开接口(工厂模式等);
2. 解耦,复用等都离不开接口,抽象共性提高复用度,当然可用实体类,但是远不如用接口或抽象类来的方便,用接口抽象共性,用具体类实现个性,可以很大程度上解耦,和提高复用度,解耦可以方便修改维护,提高复用可以减少成本!
3.一个问题可以深入亦可浅薄
转载http://www.javaeye.com/problems/1134
上面有一些关系接口的讨论,可以去看看
2抽象类多用于扩展.
3到CSDN下载个新书.
interface A{
public int fn(int para);
}
class B implements A {
public int fn(int para) {
return para-1;
}
}
class C implements A {
public int fn(int para) {
return para+1;
}
}
另一个类
class D {
public void print(A a) {
System.out.println(a.fn(5));
}
public static void main(String[] args){
B b = new B();
C c = new C();
D d = new D();
d.print(b);
d.print(c);
}
}
运行结果
4
6
这是我理解的接口的最简单的用法。
public class C extends A,B{ //这是错误的
//code
}
但是如果定义的是2个接口A,B,那么
public class C implements A,B{ //这样就可以满足要求
//code
}
可以简单的理解为接口从某种意义上解决了程序对多重继承的需要。
再者,如果用抽象类实现多态则其他所有的类都会成为该抽象类的子类(或者子类的子类等等),但是如果用接口来实现多态则每个实现接口的类之间没有必然的联系,它们和接口的关系大概也就是如果类没有完全的实现接口中的方法则要定义为抽象类。
如果你想做到数据库及时切换,如果你通过接口来做,就很方便。只要更改接口对应的实际类就可以了,比如MySqlDAO,OracleDAO,MSSDAO等。然后利用Spring,Pico等将配置写到配置文件中,使用的时候更改一下具体引用类就ok了。上面的话我没仔细看,但感觉就是那样,利用接口你可以灵活进行装配,而如果是类的话,那就固定死了,代码的弹性很低。至于抽象类和接口的区别,这个争议一直很大。我个人的感觉抽象类一般代表的是对象固有的属性,而接口代表的是行为。实际上使用的话这个界线我觉得还是蛮难划分的,可能还没理解到那个层次。但是有一点,接口可以多处引用,而一个类最多却只能继承一个抽象类。而且从面向对象的角度来讲,抽象类目前已经不提倡被使用了。至于使用接口的好处,所有的java书,面向对象编程的书籍讲的都快烂掉了,上网搜多的是。
总结一句话:面向对象编程你可以把它认为就是在面向接口编程。