Java 的interface

interface可以认为是一个“完全抽象的class”,在interface中的所有methods都是只有声明而没有定义,即没有实现。例如:
       interface A{
              void Method1();//这里不需写访问权限,Method1()就自动成为了public void Method1()
              String Method2();
}
interface中的方法无需声明,都会自动设为了public。

当然,interface中的数据成员也变为了public,static,final。
看例子:
class B implements A{
       String str="Hello";//这里的str很自然的变成了public static final String str;
       public void Method1(){
       //……//
       }
       public String Method2(){
              return str;
       }
}

所以可以用Interface:产生常量群!!由于interface中的数据成员会自动成为public static final,所以……如下:
public interface Months{
              int
JANURAUY=1,//再次说明,常量都要全部用大写,语义间用下划线分开如: VAL_XX
                     FEBRUARY=2,
                     MARCH=3;
}

       然后要用的话,就直接Months. JANURAUY*10类似的直接用就行了!完全OK!!超级好用!!
提醒:interface的常量群众的数据成员,因为是static静态的,所以当你首次使用这个常量群时,就会自动初始化里面的数据,不管你使用多少次它的数值都不会再变了。如下:
public interface Vals{
       int VAL_A=(int)(Math.random()*10);
}
我们看到,VAL_A是由随机数得值的,但当你第一次使用它时,VAL_A被赋予了一个随机数3.14,但以后不管你用多少次,都只是同一个数3.14。

 

在使用interface时,要注意下面事项:

1------>
要注意,当某个类(like class B)实现了一个接口时,一定要把它实现的methods(函数)标明为public,否则编译无法通过。

Java 没有C 那样的多重继承,但是可以通过interface来模拟,如下面
class father{}
interface Human{}
interface Boy{}
class Me extends father implements Human,Boy{}


interface可以继承别一个interface,但不可以继承一个class;如:
class A{}
abstract class B{}
interface C{}
 
//!interface D extends A{}// 不符合语法
//!interface D extends B{}// 不符合语法
interface D extends C{}//符合语法

2------>
所以,须提醒的是:class方法的名字尽量不要与interface的方法同名,或者就干脆不要写同名的方法。


看下面例子,
interface A{void a();}
interface B{void b();}
 
class Xa{
       public void a(){}
}
class Xb{
       public int b(){return 53;}
}
 
class Hero extends Xa implements A,B{
       public void b(){}
//大家注意,为什么这儿实现了 A和B 两个interface却只实现了b()一个接口呢?
}
 
//!class ErrTest extends Xb implements B{}//这为什么报告错误呢?
 
public class Test {
       static void mA(A a){//这儿之所以可以用a来调用是因为,下面会进行向上转型,
                                   //A的derived class reference传到这里,当然可以使用,下同。
              a.a();
       }
       static void mB(B b){
              b.b();
       }
     
       public static void main(String[] args) {
              Hero h=new Hero();
            
              mA(h);//向上转型,因为上面接参的是Hero的base class
              mB(h);
       }
}///:~

NO1.class Hero为什么实现了 A和B 两个interface却只实现了b()一个接口呢?因为它还同时继承了一个Xa类,而Xa中恰好又一个一模一样的void a(),所以,在继承的同时,Hero的基类Xa自动的实现了a(),Hero就不用再实现a()。
但是注意,必须要是完全相同才行!(即需要同参数列表、同返回值),否则就会?看下面:
NO2. ErrTest不能再写下去是因为,它所继承的B类的void a()与它所实现的Xb接口中的int a()产生冲突。两者名称相同,但是返回值不一样,导致编译器不知道该使用哪一个或者应该重写等,所以会报出错误。这就是冲突。