浅谈Java:interface浅析
类的访问权限
在实现一个接口时,在接口中被定义的方法必须为 public的访问权限
public interface Interface{}
interface Interface{} // 包可访问
public interface Interface{}
interface Interface{} // 包可访问
public interface Interface{
// 默认访问权限为 public
viod class<?> inter1;
}
接口的域类型
接口可以设置包含域,但是这些包含域隐式的是 static 和 final。下面,我们来证明下
interface TestData{
int DATA = 0, SUM = 0, CURRENT = 1;
}
class Test implements TestData{
public void add() {
// 编译报错:java: Unable to assign a value to the final variable SUM
// 可以证明 Test.SUM 时 final类型
Test.SUM = Test.DATA + Test.CURRENT;
}
}
可以容易看出在执行 Test.SUM = Test.DATA + Test.CURRENT报错常量不可更改。由此可证明域时final类型的
interface TestData{
Object CURRENT = 1;
void add();
}
class Test implements TestData{
private static int sum = 0;
public void add() {
synchronized (TestData.CURRENT) {
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
sum = sum + 1;
System.out.println(sum);
}
}
}
public class MoreExtendAndInterface {
public static void main(String[] args){
System.out.println(RunPid.get());
TestData test1 = new Test();
TestData test2 = new Test();
new Thread(test1::add).start();
new Thread(test2::add).start();
}
}
通过创建两个线程执行不同的Test对象的add()方法,去操作一个静态资源。通过锁对象TestData.CURRENT达到了线程同步。所以可以证明TestData.CURRENT 是静态的。
在接口中定义的域不能是“空final”,但是可以被非常量表达式初始化。例如
interface RandVals {
Random RAND = new Random(new Date().getTime());
int RAND_INT = RAND.nextINT(10);
double RAND_FLOAT = RAND.nextDouble() * 10;
}
嵌套接口
接口可以嵌套在类或其他接口中。如下
Class Test {
interface TestInterface1 {
void get();
}
interface TestInterface2 {
interface TestInterface3 {
int add();
}
}
}
在类中嵌套接口的方法是显而易见的,可以拥有public和包访问两种可见性。在类内部添加的接口也可以被实现为private。
注意事项
当子类采用向上转型时,创建的对象只能调用基类实现的方法而不能调用子类的特有方法。如下:
public interface TestInterface {
void method();
}
public class TestImpl implements TestInterface{
@Override
void method() {
}
void method1() {
System.out.println("");
}
public static void main(String[] args) {
TestInterface test = new TestImpl();
test.method(); // Don't error
test.method1(); // error, can't invoking
// For Example
List<String> strs = new LinkedList<>();
strs.addFirst(); // Don't find the AddFirst method.
}
}