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(); 
 
 
}


则不能编译通过,并提示:




Java 接口方法不实现 java接口不能用什么修饰_接口


Java 接口方法不实现 java接口不能用什么修饰_静态变量_02




而且,接口中的方法不能用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