例子一
public class Test
{
final int a;
final int b = 0;
public Test()
{
a = 0;
// b = 1;
}
public Test(int i)
{
a = 1;
}
public static void printFinal()
{
final int m = 100;
// m = 101;
final int n;
n = 102;
// n = 103;
System.out.println("m + n=" + m + n);
}
}
例子二
import cn.xy.model.Person;
public class Test2
{
final Person p = new Person("xy");
final Person p2;
public Test2()
{
p2 = new Person("xy");
p.setName("xyy");
// p = new Person("Jim");
// p = null;
}
public Test2(int i)
{
p2 = new Person("xy");
}
public static void printFinal()
{
final Person p = new Person("xy");
p.setName("xyy");
// p = new Person("Jim");
// p = null;
}
}
3 关于final修饰类和方法的例子这里不举例,读者可以试一试。
三 final内存分配
调用一个函数除了函数本身的执行时间之外,还需要时间去寻找这个函数(类内部有一个函数签名和函数地址的映射表)。故减少函数调用次数就等于降低了性能消耗。final修饰的函数会被编译器优化,优化的结果是减少了函数调用的次数。
public class Test3
{
final void function()
{
System.out.println("xy");
}
public static void main(String[] args)
{
Test3 t = new Test3();
for(int i = 0;i<1000;i++)
{
t.function();
}
}
}
经过编译器优化之后,这个类变成了相当于这样写:
public class Test3
{
final void function()
{
System.out.println("xy");
}
public static void main(String[] args)
{
Test3 t = new Test3();
for(int i = 0;i<1000;i++)
{
System.out.println("xy");
}
}
}
优点:
编译器直接将function的函数体内嵌到了调用函数的地方,这样的结果是节省了1000次函数调用,当然编译器处理成字节码,只是我们可以想象成这样,看个明白。