今天看了下Thinking in Java 关于final 的介绍。但感觉收益太少,请各位大哥们,高手们给小弟分析下:1.final 它除了用在变量上使其值不会被改变  及 用在成员方法上使其方法不会被重写  以及 用在类上使其不可被继承外。它还有什么用法?2.使用 final 声明的类,成员变量,成员方法,为什么说在性能上得到优化?它是如何优化的?3.如果我把我的javabean 里的成员方法都定义成了final.这样做会有什么问题?

解决方案 »

  1.   

    貌似记得 final 的方法 因为不用考虑动态绑定的原因 放在了方法区
    所性能上要高点 
    其他的忘光了
      

  2.   

     #1楼 得分:0回复于:2010-05-12 15:15:13貌似记得 final 的方法 因为不用考虑动态绑定的原因 放在了方法区
    所性能上要高点  
    其他的忘光了 
     
      

  3.   

    说下自己的理解,等高人解答第一个
    一般程序中用到数字的话都会直接先定义成final static静态常量,这样便于程序的可读性....第二个
    final的属性和方法在类被加载的时候就被初始化,不需要new对象就可以直接调用,所以节省内存空间,效率优化了吧。第三个没用过,全部定义成final的话,也就是类一旦加载,所有属性都会分配到空间,而你实际上是不会调用那么多属性的吧,造成资源浪费。
      

  4.   

        一个final方法被调用时会转为内嵌调用(用方法主体内实际代码的一个副本来替换方法调用),不会使用常规的压栈方式(将自变量压入堆栈;跳至方法代码并执行它;跳回来;清除堆栈自变量;最后对返回值进行处理),这样做可避免方法调用时的系统开销。当然,若方法体积太大,那么程序也会变得雍肿,可能受不到嵌入代码所带来的任何性能提升。因为任何提升都被花在方法内部的时间抵消了。Java编译器能自动侦测这些情况,并颇为“明智”地决定是否嵌入一个final方法。然而,最好还是不要完全相信编译器能正确地作出所有判断。通常,只有在方法的代码量非常少,或者想明确禁止方法被覆盖的时候,才应考虑将一个方法设为final。
        类内所有private方法都自动成为final。由于我们不能访问一个private方法,所以它绝对不会被其他方法覆盖(若强行这样做,编译器会给出错误提示)。可为一个private方法添加final指示符,但却不能为那个方法提供任何额外的含义。
      

  5.   

    1、应该没了
    2、3楼回答你了,但是我觉得不对吧?
    3、无法使用set方法=======================================================
    不需要初始化???我觉得不是吧
    因为一般我们定义final类型的时候,都加了static关键字。而且即使有static,也并不能节省内存,它们只不过是已经初始化好了的属性和方法,可以直接用,它们已经“占好”了内存。最多是节省了使用 new 关键字开辟新内存空间的时间,节省的这些时间被消耗在了jvm加载class的时候了,而不是程序运行的时候。对不?
      

  6.   

    Java中的final关键字通常的指的是“这是无法改变的”。它可能被做为三种的修饰词.------数据,方法,类。一 final数据     这里又可分为两种:
                  1.在修饰基本类型时,表示它是一个常量,在定义时必须给予赋值.特别的一个既是static又是final 的字段只占据一段不能改变的存储空间。
                  2.在修饰对象或者数组时,它表示对对象或数组的引用恒定不变,然而对象本身却是可以修改的.     空白final:声明为final但末给定初值的字段,但必须确保空白final在使用前被初始化,一般在构造方法完成。
         final参数:在方法的参数列表以声明的方式将参数指明为final,这意味着在方法里无法修改参数的引用所指向的对象。二 final方法
          使用final使用的原因有两个:
               一. 把方法锁定,使得在子类(导出类)中不能修改它的含义。
               二.效率,一个final方法被调用时会转为内嵌调用,不会使用常规的压栈方式,使得运行效率较高,尤其是在方法体较简单的情况下,但也并不绝对。(与C++中的inline关键字类似)
              特别的:类中的所有private方法都隐式地指定为是final,所以在继承关系中不存在覆盖问题。三 final类
        
         声明为final的类不能派生出了子类,也就是不能被继承,一个final类中的所有方法都隐式地指定为final.
      

  7.   

    1.在类中的声明中使用final
      类的声明中可以使用final,被定义成final的类不能再派生子类,类不能被继承。2.在成员方法中使用final
      对于类中的方法可以定义为final,被定义成final的方法不能被重写。3.成员变量的声明中使用final
      如果类的成员变量被定义为final,则变量一经赋值就不能改变。
      

  8.   


    嗯我说错了,其实想说的是static,一般final属性都会跟着static一起用的
      

  9.   

    俺也来补充一下楼上有些不对的:
    对于final的变量在声明时不一定要赋值,你可以放在构造函数或者是其他的可以初始化的语句块中。例如:public class Test
    {
        public final int a;    public Test()
        {
            a = 3;
        }
    }
    或者public class Test
    {
        public static final int a;
        static {
            a=3;
        }
        public static void main(String[] args)
        {
            System.out.println(a);
        }
    }