教你在java接口中定义方法-mile米乐体育

基本上所有的java教程都会告诉我们java接口的方法都是public、abstract类型的,没有方法体的。

但是在jdk8里面,你是可以突破这个界限的哦。

假设我们现在有一个接口:timeclient,其代码结构如下:

import java.time.*;  public interface timeclient {     void settime(int hour, int minute, int second);     void setdate(int day, int month, int year);     void setdateandtime(int day, int month, int year,                                int hour, int minute, int second);     localdatetime getlocaldatetime(); }

接下来,simpletimeclient类实现了timeclient接口,具体代码如下:

package defaultmethods;  import java.time.*; import java.lang.*; import java.util.*;  public class simpletimeclient implements timeclient {      private localdatetime dateandtime;      public simpletimeclient() {         dateandtime = localdatetime.now();     }      public void settime(int hour, int minute, int second) {         localdate currentdate = localdate.from(dateandtime);         localtime timetoset = localtime.of(hour, minute, second);         dateandtime = localdatetime.of(currentdate, timetoset);     }      public void setdate(int day, int month, int year) {         localdate datetoset = localdate.of(day, month, year);         localtime currenttime = localtime.from(dateandtime);         dateandtime = localdatetime.of(datetoset, currenttime);     }      public void setdateandtime(int day, int month, int year,                                int hour, int minute, int second) {         localdate datetoset = localdate.of(day, month, year);         localtime timetoset = localtime.of(hour, minute, second);         dateandtime = localdatetime.of(datetoset, timetoset);     }      public localdatetime getlocaldatetime() {         return dateandtime;     }      public string tostring() {         return dateandtime.tostring();     }      public static void main(string... args) {         timeclient mytimeclient = new simpletimeclient();         system.out.println(mytimeclient.tostring());     } }

现在假设你想在接口timeclient中添加一个新功能,通过这个功能我们可以指定我们所在的时区。

public interface timeclient {     void settime(int hour, int minute, int second);     void setdate(int day, int month, int year);     void setdateandtime(int day, int month, int year,         int hour, int minute, int second);     localdatetime getlocaldatetime();                             zoneddatetime getzoneddatetime(string zonestring); }

随着timeclient的变化,你不得不修改你的simpletimeclient类,实现getzoneddatetime方法。一般来说,设置时区这个功能会是各个timeclient实现类中通用的一个功能。这个时候,你通常会选择再定义一个abstracttimeclient类来实现getzoneddatetime方法。而在jdk8中,你可以选择直接在接口中来实现该方法(interface已经把手伸到abstract class的地盘了)。

package defaultmethods;  import java.time.*;  public interface timeclient {     void settime(int hour, int minute, int second);     void setdate(int day, int month, int year);     void setdateandtime(int day, int month, int year,                                int hour, int minute, int second);     localdatetime getlocaldatetime();      static zoneid getzoneid (string zonestring) {         try {             return zoneid.of(zonestring);         } catch (datetimeexception e) {             system.err.println("invalid time zone: "   zonestring                   "; using default time zone instead.");             return zoneid.systemdefault();         }     }      default zoneddatetime getzoneddatetime(string zonestring) {         return zoneddatetime.of(getlocaldatetime(), getzoneid(zonestring));     } }

从上面的例子,我们可以看到通过static和default修饰符我们可以直接在接口中实现方法体,同时不要忘记,任何在接口中方法声明都是public类型的哦。

ok,现在我们需要一个新的接口:anothertimeclient,它得继承timeclient接口。那么,对于timeclient接口中定义的getzoneddatetime方法,你可以做如下三种处理:

  1. 重新声明getzoneddatetime方法,使它变成abstract类型。
  2. 重新定义getzoneddatetime方法。
  3. 直接继承。

而static方法和我们在类里面定义的static方法概念一致。

展开全文
内容来源于互联网和用户投稿,文章中一旦含有米乐app官网登录的联系方式务必识别真假,本站仅做信息展示不承担任何相关责任,如有侵权或涉及法律问题请联系米乐app官网登录删除

最新文章

网站地图