这是我为调查您的问题所做的实验。下面的代码使用反射 api 来检查是否strictfp
在各种情况下声明了。
结论:
- 在strictfp 接口中声明的抽象方法在实现该接口的类中不会是 strictfp
- 在strictfp 接口中声明的默认方法将在实现该接口的类中 stricfp
- 实现strictfp 接口的类中的方法不会自动为 strictfp
- 在strictfp 接口的内部类中声明的所有方法都将具有 stricfp 修饰符
总结一下——如果在strictfp
接口上声明了,那么所有的非抽象代码——默认方法、带有方法的内部类——都是自动的strictfp
。
请注意,strictfp
修饰符不适用于抽象方法。
import java.lang.reflect.Modifier;
strictfp interface StrictInterface {
void someInterfaceMethod();
default void someInterfaceDefaultMethod() {}
class InnerTest {
public static void innerMethod() {}
}
}
class Impl implements StrictInterface {
@Override
public void someInterfaceMethod() {}
public strictfp void someClassMethod() {}
public void someClassMethod2() {}
}
public class Test {
public static void main(String argv[]) {
checkModifiers(Impl.class, "someInterfaceMethod");
checkModifiers(Impl.class, "someClassMethod");
checkModifiers(Impl.class, "someClassMethod2");
checkModifiers(Impl.class.getInterfaces()[0], "someInterfaceDefaultMethod");
checkModifiers(StrictInterface.InnerTest.class, "innerMethod");
}
public static void checkModifiers(Class clazz, String m) {
try {
int mod = clazz.getDeclaredMethod(m, new Class[0]).getModifiers();
String res = m + " modifiers: " + Modifier.toString(mod);
System.out.println(res);
} catch (Exception e) {
e.printStackTrace(System.out);
}
}
}
程序的输出:(在OSX上使用jdk1.8.0_91.jdk)
someInterfaceMethod modifiers: public
someClassMethod modifiers: public strictfp
someClassMethod2 modifiers: public
someInterfaceDefaultMethod modifiers: public strictfp
innerMethod modifiers: public static strictfp