看了许多关于接口的帖子,我对于接口仍然有两个问题不明白:
1. 接口是如何弥补单一继承之不足的?
2. 接口是如何实现“通信”的?对于这两个问题,我真的很希望有哪位大哥能够给出实际的例子。如果没有例子,只要能讲得清楚也行,小弟在此磕头了。

解决方案 »

  1.   

    1 打个比方,你有一个两相插头的接口,还有一个三相插头的接口,这时你设计一个类,如果你设计的这个类只是继承了某个接口(比如两相插头的接口),那么你这个类只具有你继承的这个接口的接口方法,另一个接口方法(比如三相插头的接口方法)该类是不具有的;但是如果你设计的这个类都实现了那两个接口,那么你这个类就同时具有了两相插头的接口三相插头的接口;这样就弥补了单一继承的不足。2 不太明白这个问题的意思?你所谓的通信是指什么?你调用接口的方法,不就是跟接口通信吗?举例
    interface InterfaceOne {
        void doJobOne();
    }interface InterfaceTwo {
        void doJobTwo();
    }public class MyJob implements InterfaceOne, InterfaceTwo {
        public static void main(String[] args) {
            MyJob mj = new MyJob();
            mj.doJobOne();
            mj.doJobTwo();
        }
        public MyJob() {
            System.out.println("constructor");
        }
        public void doJobOne() {
            System.out.println("do job one.");
        }    public void doJobTwo() {
            System.out.println("do job two.");
        }
    }
      

  2.   

    第2个问题中的通信,是我们培训的时候,课件上面介绍的一个功能,具体我不知道是什么意思,我想是不是两个对象之间属性的相互赋值?上面的例子当中,我仍然看不出接口有什么作用。
    在继承的情况下,子类实例化的对象是可以直接调用父类的方法的,但是用接口的话,怎么可以产生继承的效果?
    另外,我上机试了一下。比如我希望类B的对象b能够也具有类A的方法,并能够调用该方法,那我直接在类B中申明一个类A的对象,然后在main方法中申明b,这样b不就具有了A的功能了吗?这样不是就可以不用接口了?class B{
    void bb(){
    System.out.println("bbbbb");
    }
    }
    class A{
    B b=new B();
    void aa(){
    b.bb();
    }
    }
    public class Ex4{
    public static void main(String args[]){
    A a=new A();
    a.aa();
    }
    }
      

  3.   

    ------------------------
    另外,我上机试了一下。比如我希望类B的对象b能够也具有类A的方法,并能够调用该方法,那我直接在类B中申明一个类A的对象,然后在main方法中申明b,这样b不就具有了A的功能了吗?这样不是就可以不用接口了?
    ------------------------
    这如果从设计模式的角度看,可以看作builder模式,相当于你把零散的每个类组合成一个大类,但是这样的模式不适合通用化,除非都是抽象类。其实,接口的主要目的就是为了通用化,就好象生产零件都要符合国际标准接口一样,比如我有辆车,里面某个零件坏了,这时我用另外一个厂家的零件替换也可以,只要接口是一样的就行;否则,如果接口不一样,我就只能用原来那个厂家的零件,如果原来那个厂家倒闭了,那我的车就报废了。所以,考虑到通用化,生产商就要定义一个标准的零件接口,每个厂商根据这个接口生产自己的零件,这些生产出来的零件就是具体实现该零件接口的子类。由于生产商不同,生产出来的零件也各具特点,比如某厂商的车座是固定的,另一厂商的车座是可以躺下的,但都符合车座的接口标准,所以用户可以根据需要选购不同的车座。这就是接口相同,子类多样化。
    同样的,在实际的程序开发中,比如
    interface B {
        void install();
    }
    class A {
        public void install(B b) {
            B.install();
        }
    }
    这样,把A类看作车,B类看作车座,A类要安装车座时,只需要调用B类的install接口就行了,这时A并不关心B是被那个厂商生产的,只要有install接口就行。而其他生产商就可以根据B接口生产出不同的子类B1,B2等等
    这样某个人要给车配上车座时就可以这样
    class Person {
        public static void main(String[] args) {
            A a = new A();
            B b = new B1(); //这里可以根据实际情况自己选择B1或是B2
            a.install(b);
        }
    }