内联是Java即时编译器执行的优化。
如果有方法:
public int addPlusOne(int a, int b) { return a + b + 1;}您这样称呼:
public void testAddPlusOne() { int v1 = addPlusOne(2, 5); int v2 = addPlusOne(7, 13); // do something with v1, v2}编译器可能会决定将您的函数调用替换为函数主体,因此结果实际上将如下所示:
public void testAddPlusOne() { int v1 = 2 + 5 + 1; int v2 = 7 + 13 + 1 // do something with v1, v2}编译器这样做是为了节省实际进行函数调用的开销,这将涉及将每个参数压入堆栈。
显然,只能对非虚拟功能执行此操作。考虑一下如果子类中重写了该方法并且直到运行时才知道包含该方法的对象的类型会发生什么…编译器将如何知道要复制的代码:基类的方法主体或子类的方法体?由于在Java中默认情况下所有方法都是虚拟的,因此您可以显式标记那些无法覆盖的方法
final(或将它们放入
final类中)。这将有助于编译器确定该方法永远不会被覆盖,并且可以安全地内联。(请注意,编译器有时也可以针对非最终方法做出此确定。)
另外,请注意引号中的单词“ 可能 ”。最终方法不能保证是内联的。您可以通过多种方法来保证方法无法内联,但是无法 强制
编译器内联。无论如何,内联将有助于或不利于所产生的代码的速度,几乎总是比您了解的更多。
有关收益和问题的完整概述,请参见Wikipedia。



