以下是我为调查您的问题所做的实验。下面的代码使用反射 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