1、接口的修饰符是可选的。当省略时,则默认为默认访问权限。如果要用修饰符进行修饰,则只能用public修饰符。
2、接口中的方法默认为public abstract的,在声明时可以显式地注明,也可以省略。如:
interface InterfaceTestA
{
public abstract void run();
}
等价于
interface InterfaceTestA
{
void run();
}
但在类中实现方法的时候,必须用public修饰方法。因为如果用public修饰,则类中方法的访问权限为默认级别,与接口中声明的方法级别不同(与public级别相比,默认级别的访问权限更低,导致两个方法的声明不完全一致),因此会提示错误。同样,如果用private和protected修饰要实现的方法,也会提示错误。如:
class InterfaceTestB implements InterfaceTestA
{
public void run();
}
可以编译通过,而如下代码
class InterfaceTestB implements InterfaceTestA
{
void run();
}
则不能编译通过,并提示:
而且,接口中的方法不能用static和final来修饰。首先,接口中的方法一旦被static修饰,就变成了抽象静态方法。而静态抽象方法在java中是不允许的。因为,静态方法是通过类直接调用的,而抽象方法必须经子类实现之后并实例化才能调用,所以产生调用机制上的矛盾。其次,方法一旦被final修饰,则不能被重写。而接口中的方法必须要在类中实现,因此不能用final修饰。
3、接口中的变量默认为(也可以显式地声明为)public static final,不能用其他修饰。在类中未声明同名变量的时候,通过实例、类、接口都可以访问该变量。如以下程序
public class InterfaceTest
{
public static void main(String[] args)
{
B b = new B();
System.out.println(b.num);
System.out.println(B.num);
System.out.println(A.num);
}
}
interface A
{
int num = 5;
}
class B implements A
{
}
运行结果为:
5
5
5
如果在类中定义了同名的非静态变量。此时通过实例访问的是类中的非静态变量,值为6;通过接口访问的是接口中的静态变量,值为5。
public class InterfaceTest
{
public static void main(String[] args)
{
B b = new B();
System.out.println(b.num);
//System.out.println(B.num); 若运行此行,会报错:无法从静态上下文中引用非静态变量。因为此是类B中的变量为非静态的,无法通过类直接访问。
System.out.println(A.num);
}
}
interface A
{
int num = 5;
}
class B implements A
{
int num = 6;
}
运行结果为:
6
5
如果在类中定义了同名的静态变量。此时通过实例和类访问的是类中的非静态变量,值为6;通过接口访问的是接口中的静态变量,值为5。
public class InterfaceTest
{
public static void main(String[] args)
{
B b = new B();
System.out.println(b.num);
System.out.println(B.num);
System.out.println(A.num);
}
}
interface A
{
int num = 5;
}
class B implements A
{
static int num = 6;
}
运行结果为:
6
6
5