浅谈Java:interface浅析

浅谈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.
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值