教你在java接口中定义方法-mile米乐体育
java学习
2020年03月27日 23:25
0
基本上所有的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方法,你可以做如下三种处理:
- 重新声明getzoneddatetime方法,使它变成abstract类型。
- 重新定义getzoneddatetime方法。
- 直接继承。
而static方法和我们在类里面定义的static方法概念一致。
展开全文