定义final的作用:
2.能够带来更高的效率。将方法标记为final可以让编译器将所有final方法的调用转变为内联调用,当编译器看到final 方法调用时,根据自己判断略去通过方法调用机制插入代码的步骤,调用机制包括将方法参数压栈,清除参数和最后处理返 回值。
与这套方法不同,编译器可以在方法体中使用实际的代码替换方法调用。如果方法过大,在方法调用和方法返回方面的时 间节省将会变得很小,这取决与方法内部花去的时间总量。
一般来说,短小的方法能够从内联中获益。内联的好处不局限于方法的大小,还会带来进一步的优化,如减少无用的代码 和更多的内联。
注:
由于private和static方法不能在子类中被重写,因此他们总是隐式的final
Java不允许显式地标记方法为内联方法,编译器会根据自己的判断,在代码中将方法标记为final。
这里面就是final变量和普通变量的区别了,当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切 值,则编译器会把它当做编译期常量使用。也就是说在用到该final变量的地方,相当于直接访问的这个常量,不需要在运行时 确定。
1. final类不能被继承,没有子类,final类中的方法默认是final的。
2. final方法不能被子类的方法覆盖,但可以被继承。
3.final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
final的好处:
1.final方法可以告诉编译器对于final方法的调用不需要动态的绑定,这会让代码变得略微更有效一点,静态方法的绑定 总是比动态方法的绑定更加高效,因为在动态方法的绑定中,运行时需要解析方法的调用2.能够带来更高的效率。将方法标记为final可以让编译器将所有final方法的调用转变为内联调用,当编译器看到final 方法调用时,根据自己判断略去通过方法调用机制插入代码的步骤,调用机制包括将方法参数压栈,清除参数和最后处理返 回值。
与这套方法不同,编译器可以在方法体中使用实际的代码替换方法调用。如果方法过大,在方法调用和方法返回方面的时 间节省将会变得很小,这取决与方法内部花去的时间总量。
一般来说,短小的方法能够从内联中获益。内联的好处不局限于方法的大小,还会带来进一步的优化,如减少无用的代码 和更多的内联。
注:
由于private和static方法不能在子类中被重写,因此他们总是隐式的final
Java不允许显式地标记方法为内联方法,编译器会根据自己的判断,在代码中将方法标记为final。
final关键字要点:
public class Student(){
public final int ID;
public Student(){
ID=createID();
}
public int createID(){
return .. //generate new ID
}
}
1.空缺final变量是一种声明为final但未初始化的变量,空缺final必须在构造函数中初始化,空缺final变量只在对象生命周 期中调用一次.
2.空缺final如果在某个构造函数中初始化, 就必须在类的所有重载构造函数中进行初始化,final变量不能指向除初始化时 设置的对象之外的任何对象,如果final变量保存指向对象的引用,那么引用必须保持不变,而非对象。可以通过调用赋值方 法来改变对象的状态
public class MyClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
String a = "hello2";
final String b = "hello";
String d = "hello";
String c = b + 2;
String e = d + 2;
System.out.println((a == c));
System.out.println((a == e));
}
public static String getHello() {
return "hello2";
}
}
这里面就是final变量和普通变量的区别了,当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切 值,则编译器会把它当做编译期常量使用。也就是说在用到该final变量的地方,相当于直接访问的这个常量,不需要在运行时 确定。