java接口定义常量研究

midoll 558 2022-05-31

java接口定义常量研究

和同事讨论到,在接口中定义常量的问题,引发了争论,即,假如在接口中定义变量,是否需要用static来限定的问题,或者说用static和不用static会有什么区别。
引论

package spring.interfaceTest;

public interface IAnimal {
    // 定义成静态变量
    public static int num = 10;

   // 定义成非静态变量
    public int num2=20;
}

即上述的常量定义,到底哪个是正确的。

接口的定义

  • 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,
    接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
    引用某位学者定义,interface即标准;即interface用于定义一个通用行的标准,因而interface并不会为某个特殊的类进行定义接口或者变量。
    那么interface是没有成员变量的,即interface定义的变量针对所有类均生效,因此变量是static的。
    所以上面的定义,public static int num = 10;和public int num = 10;是等价的。

讨论1

interface的public是否必须?声明成private会怎么样?
如上面描述,interface是标准,标准是给别人用的,定义成private是没有意义的。所以interface默认就是public。
因此

private void saying();

定义这么个方法,直接编译器会报错的。

讨论2

是否可以嵌套定义内部接口

public interface IAnimal {

    interface data{
        int num1=1;
        int num2=2;
    };
}

调用

@Test
    public void testDog(){
        System.out.println(IAnimal.data.num1);
    }

经过验证可以使用,参参照标准的定义,不难理解,只是标准嵌套标准而已,在大标准下有一个小标准。

讨论3

类里是否可以定义接口?
同理可得,将接口如果定义在类里面,也是具有同样的作用,相当于一个类持有了一个标准,那么整个类的实例都将持有这个标准。

package spring.interfaceTest;

public class Dog {

    interface data{
        int num1=1;
        int num2=2;
    };

}

同理可以使用

总结

interface作为一种标准,本身就是static,为所有类共同使用,因此不存在归属interface本身或者单独为某个类定义的变量或者方法


# java