`

Trail: Learning the Java Language_Lesson: Interfaces and Inheritance1

 
阅读更多

有很多情形,需要让不同的程序员都遵守某个契约,来约束他们软件的行为

程序员之间无需关心他人是如何实现的,通常来说,这也就是接口的来源

 

比如各种各样的车在路上行驶,某个公司来定义他们的交通规则,另一个公司则教导他们使用GPS系统查看路况,或者如何使用收音机

公司之间无需关心对方在做什么,实际上每家公司都拥有自己的特殊权利,任何时候都能进行内部运作

 

Java中的接口跟类相似,也是一个引用类型

接口不能实例化,只能被某个类实现,或被其他接口继承(后面详述)

 

接口的定义:修饰符,interface,接口名,extends多个接口{}

接口的修饰符跟类一样只有两种,但接口可以继承多个接口

如果定义一个变量的类型是接口,只能用实现了这个接口的类或子类的对象赋值

 

 

接口里可以有字段,他们全部只能是public, static, 和 final的,因此也可以不写

 

接口里可以有abstract方法,default方法和static方法,他们全部只能是public的,因此public可以不写

接口里也可以什么都没有

 

abstract方法是没有方法体的,不写就默认abstract,在小括号后直接跟的是分号

 

public interface OperateCar {

   // constant declarations, if any

   // method signatures
   
   // An enum with values RIGHT, LEFT
   int turn(Direction direction,
            double radius,
            double startSpeed,
            double endSpeed);

 

实现他的类需要实现这些方法,不实现的类也是abstract类

 

default方法和static方法是有方法体的

考虑往一个接口里添加一个方法时,直接添加的话,所有实现这个接口的类都要报错,因为没有实现新加的方法

第1种.可以新建一个接口,继承原来的那个,再另外添加个新方法,这样哪些类可以选择是否换成新的接口,不换也没事

第2种,声明为static方法,其他类可以用接口名直接调用

第3种.可以在原接口里添加新方法,声明为default,并有方法体,有默认实现,其他类会当做自己也有

 

public interface DoIt {

   void doSomething(int i, double x);
   int doSomethingElse(String s);
   default boolean didItWork(int i, double x, String s) {
       // Method body 
   }
   
}

他的子类(确切的说是子接口)处理default方法有几种情况:

 

无视,将会默认继承

不加default,重新声明一次,将变成abstract方法

加default,并覆盖掉,成为新的接口

 

 

default方法与lambda expressions( 略)

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics