针对java初学者的java接口使用的注意事项

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

你可能感兴趣的:(java,接口)