Java se5新增加@Override,它不是一个关键字(有人说它是伪代码),也可以当作关键字使用。常见在实现接口的方法上。当需要重写(覆写)的时候,可以选择添加這个annotate。這个annotate可以检查你是否重写正确,因为有时候我们可能会把重写误写成重载了。此时编译器就回提示一条错误信息。
重载: 重载的时候,方法名要一样。但是参数类型,参数个数不一样,返回值可以相同也可以不相同。返回值是不能作为区别重载函数。
重写/覆写:若子类中的某一方法和父类中的某一个方法具有相同的方法名,参数列表,返回参数。则子类的新方法将覆盖父类的方法。
分析下面一段代码:
public static TimerTask loginLog(final Long userId, final String ip) {
return new TimerTask() {
@Override
public void run() {
try {
LoginLog loginLog = LogFactory.createLoginLog(LogType.LOGIN, userId, null, ip);
loginLogMapper.insert(loginLog);
} catch (Exception e) {
logger.error("创建登录日志异常!", e);
}
}
};
}
首先我们来看一下TimerTask這个类:
可见這个类是一个抽象类,抽象类是不能直接new的,必须有实现类,才能new出它的实现类。
new TimerTask() {}
看到這句话一定有疑问吧,一般来说,new一个对象是小括号后是一个分号结束。這句话后面有一对花括号,肯定别有意义了。后面跟上花括号,表示new的是一个匿名类部类。花括号中是该new出对象的具体实现方法。new TimerTask() {}這个就是一个匿名类部类。
這个类部类还可以这样写:
class SonOne extends TimerTask{
@Override
public void run() {
try {
LoginLog loginLog = LogFactory.createLoginLog(LogType.LOGIN, userId, null, ip);
loginLogMapper.insert(loginLog);
} catch (Exception e) {
logger.error("创建登录日志异常!", e);
}
}
}
return new SonOne();
一样的效果。