1、当然有错。a到底是A还是A的数组?a不能调用B_m方法,同样b也不能调A_m方法,除非强制类型转换。有一点你理解对了:用接口声明的变量(引用)可以存放实现该接口的对象的引用。2、你的理解是对的。抽象类和接口还是很有区别的:抽象类不能多重继承,可以在定义中实现部分方法。接口可以"多重继承",不能实现任何方法。相同点:都不能直接生成实例。

解决方案 »

  1.   

    对于第二个问题,我要纠正一下。不是实现了Enumeration接口的Vector对象,这样理解有问题:具体的实现不是Vector对象,是一个内部的对象,大可不必关心,只管按接口的方法用就好了。
      

  2.   

    Vector v=new Vector();
    Enumeration e=v.elements();你是否可以这样想?public interface I{}public class C{
      public I Is(){
        return new I(){};
      }
    }C c = new C();
    I i = c.Is();
      

  3.   

    最近有点习惯给方法加上public
      

  4.   

    不好意思,我第一个问题的代码写错了,a变量做了重复声明,修改如下:
    我是说一个抽象类或接口声明的数组,其元素可否为其不同子类的对象(像 C++ 一样)?interface A
    { A_m(); }interface B
    { B_m(); }class AB1 implements A,B

    AB1(){}; 
    ... //接口中方法的实现
    }class AB2 implements A,B

    AB2(){}; 
    ... //接口中方法的实现
    }...
    A a=new AB1();
    B b=new AB1();
    A aa[2];
    aa[0]=new AB1();
    aa[1]=new AB2();
    a.A_m(); a.B_m();
    b.A_m(); b.B_m();
    ...
    //上述语句有错误吗?如果把接口改成抽象类呢?接口和抽象类是不是具有同样的用法呢?
      

  5.   

    当然有错。a不能调用B_m方法,同样b也不能调A_m方法,除非强制类型转换。
      

  6.   

    to sean_gao(大胃):关于第二个问题:关键是e引用的那个对象是哪个类构造的,不可能是接口吧,那就只能是实现该接口的类了,即Vector, 若系统内部构造了一个对象,是否也有这样的一个类存在?
    还有:
    A a=new AB1();不属于类型转换的一种吧?
    那a不能调用B_m()方法,但对象a中一定包含了B_m()的入口吧,这样说来,是不是说就是把a中实现的非A接口的方法的入口给屏蔽(隐藏)掉了(如果可以强制类型转换而引用的话,应该是这样的吧),还是就没有了那些入口(内存中释放了那些入口地址的空间,这样就不能够强制类型转换了)?
    我上述的理解对吗?
    谢谢!
      

  7.   

    to javafaq2004(农村干部瞎忙活) :public interface I{}public class C{
      public I Is(){
        return new I(){};
      }
    }C c = new C();
    I i = c.Is();接口不能构造对象的,它连构造方法都没有!
    如果I是类的话,我就不会提出这个问题了!
      

  8.   

    关于第二个问题:关键是e引用的那个对象是哪个类构造的,不可能是接口吧,那就只能是实现该接口的类了,即Vector, 若系统内部构造了一个对象,是否也有这样的一个类存在?
    -------------------------------------------------------------------------------
    Enumeration e=v.elements();
    v 返回的是一个实现了Enumeration接口的内部类!
    还有:
    A a=new AB1();不属于类型转换的一种吧?
    那a不能调用B_m()方法,但对象a中一定包含了B_m()的入口吧,这样说来,是不是说就是把a中实现的非A接口的方法的入口给屏蔽(隐藏)掉了(如果可以强制类型转换而引用的话,应该是这样的吧),还是就没有了那些入口(内存中释放了那些入口地址的空间,这样就不能够强制类型转换了)?
    我上述的理解对吗?
    谢谢!
    ---------------------------------------------------------------------------------
    你首先要搞清楚a是一个A指针,new AB1()得到一个AB1()实例,a指向这个实例。所以内存中有整个完整的AB1()实例,但是因为a是A的指针,所以只能调用A中规定的方法。也可以理解为A接口屏蔽掉了AB1()中的其他方法。接口的其中之一作用就是屏蔽那些不想让用户调用的方法。
      

  9.   

    你首先要搞清楚a是一个A指针,new AB1()得到一个AB1()实例,a指向这个实例。所以内存中有整个完整的AB1()实例,但是因为a是A的指针,所以只能调用A中规定的方法。也可以理解为A接口屏蔽掉了AB1()中的其他方法。
    ****************************************************
    a是一个引用,而不是指针,虽然没有多大的区别.其他的不错.
    赞成大胃的话.
      

  10.   

    那关于下面的代码是不是也是正确的?A aa[2];
    aa[0]=new AB1();
    aa[1]=new AB2();即一个抽象类或接口声明的数组,其元素可否为其不同子类的对象(像 C++ 一样)?
      

  11.   


    to JavaVsNet(JavaVsNet):“接口的其中之一作用就是屏蔽那些不想让用户调用的方法。”
    抽象类是不是也有同样的功能呢?在这个问题上是否和接口的用法相同?
      

  12.   

    第一个问题在于你的声明,你把它声明成了A类型,自然不能调用B的方法,因为这时候他是一个A的实例,如果你声明称AB,就没问题了,因为它既是A也是B
    A aa[2];
    aa[0]=new AB1();
    aa[1]=new AB2();
    这个没有错,因为不管AB1还是2都是A第二个问题实际和第一个一样,返回的实际上是某一个实现了该接口的一个子类的实例,这样做主要为了扩展,这样即使以后这个方法需要返回其它的类型也不用修改和重新编译代码