日期:2014-05-20  浏览次数:20718 次

关于"接口"的四问以及二个错代码求改正?
接口可以被实例化吗?
接口可以继承接口吗?
接口可以实现多个接口吗?
抽象类和接口有什么区别?

代码一
abstract   class   Name{
      private   String   name;
      public   abstract   boolean   isStupidName(String   name){}
}
//是不是把boolean改成void就可以了??


代码二
public   class   Something{
    void   doSomething(){
    private   String   s= " ";
    int   l=s.length();
}
}
//private   报错,为什么不能被修饰?

------解决方案--------------------
区别:接口类中的方法皆抽象,抽象类中可以有非抽象方法
接口中所有成员皆为public,所有属性都是静态的,所有成员属性皆为常量,不能被实例化,没有构造,主要解决java中没有多继承,只能接口继承接口。
当一个类中有抽象方法,该类必须为抽象类,抽象类不能被实例化,抽象类中的抽象方法必须由子类实现,如果子类不实现,有可能编译出错,除非子类也是抽象类。

其余参考一楼。
------解决方案--------------------
上面2,3楼说得好详细了(不过现在的面试官都是变态的,我就遇到很多,说我们的题你不会在网上找到的,其实就换一个方法去考你,万变不离其中)
------解决方案--------------------
首先你要明白一个类如下
class A
{
public int getMaxA(int a,int b);
}
每个类有一个函数表 也就是函数地址的数组....如果编入了一个模块那么函数的地址就是固定的.
如果这个模块发生了改变,函数的地址就会改变 那么使用这个模块的工程都需要重新编译.
class B extends A
{
public int getMaxB(int a,int b);
}
这2个类的函数表看起来如下
A B
[getMaxA] [getMaxA]
[getMaxB] 
如果将getMaxA 声明为纯虚函数,则不能构建A的实例.而且B必须实现getMaxA 否则也不能构建实例.
此时函数表如下
A B
[NULL](空地址) [getMaxA]
[getMaxB]
我们只需要将 A类供给别人使用就行了.他无法知道getMaxA如何实现的.
我们可能会提供这么一个函数
A GetA()
{
A tempA = new B()
return A;
}

那么调用A.getMaxA 时 实际调用的是B.getMaxA. 这就是所谓的接口.一个重要的地方是
以后即使你改变了B类,那么只重新编译B类所在模块即可,其他模块无需重新编译.
简单的说这就是动态绑定函数地址,而不是在编译时就把函数地址写时.