黑马程序员技术交流社区
标题:
在Java接口中定义方法(JDK8)
[打印本页]
作者:
wizong
时间:
2016-6-28 22:35
标题:
在Java接口中定义方法(JDK8)
本帖最后由 wizong 于 2016-6-28 22:36 编辑
基本上所有的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方法概念一致。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2