`
你是救世主
  • 浏览: 123689 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 中的 final 变量

阅读更多

 

【java中为什么会有final变量】:

    final这个关键字的含义是“这是无法改变的”或者“终态的”;

    那么为什么要阻止改变呢?

    java语言的发明者可能由于两个目的而阻止改变:

    1).效率问题:

        jdk中的某些类的某些方法,是不允许被用户覆盖的,设计者可能认为,所用方法已经是最好的方法,

        用户私自覆盖,或是由于疏忽而覆盖,就会影响JVM或是系统的系能;

    2). 设计所需:

        众所周知,有些情况必须使用final关键字,比如方法中的匿名内部类的参数传递;

 

【final关键字的使用方法】:

    【修饰变量】:

        final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

    【修饰方法】:

        final方法不能被子类方法覆盖,但可以被继承。

    【修饰类】:

        final类不能被继承,没有子类,final类中所有方法都是final的。

 

【final的内存分配方式】:

    【修饰变量】:

        通常情况下,final变量有3个地方可以赋值:直接赋值,构造函数中,或是初始化块中。

        【初始化】:

            由于在java的语法中,声明和初始化是联系在一起的,

            也就是说:如果你不显示的初始化一个变量,系统会自动用一个默认值来对其进行初始化。(如int就是0)

            对于final变量,在声明时,如果你没有赋值,系统默认这是一个空白域,在构造函数进行初始化,

            如果是静态的,则可以在初始化块。

        【内存】:

             常量(final变量)和非final变量的处理方式是不一样的。

             每一个类型在用到一个常量时,都会复制一份到自己的常量池中。

             常量也像类变量(static)一样保存在方法区,只不过他保存在常量池。

             (可能是,类变量被所有实例共享,而常量池是每个实例独有的。)

    【修饰方法】:

        保存在方法区,并且可以被函数代码直接替换,而不用等到执行时再决定具体是那个函数。

    【修饰类】:

        保存在方法区。

 

【java中变量的初始化顺序】:

     变量的初始化次序优于任何方法,甚至在构造方法的前面。对于static变量也是一样,

     如果变量是原始类型,那么它得到一个标准的原始类型的初始值,

     如果是一个对象的引用,除非你创建了一个新的对象给这个引用,否则就是null。

     static变量在需要的时候才会初始化,并且在这个类的构造函数和所有其他普通变量之前调用,static之后就不再进行初始化了,

     static变量在类初始化时(注意不是实例),就必须分配内存空间,

     static变量单独划分一块存储空间。

 

     java类首次装入时,会对静态成员变量或方法进行一次初始化,

     先初始化父类的静态代码-->初始化子类的静态代码-->

     (创建使历史,如果不创建实例,则后面的不执行)初始化父类的非静态代码-->初始化父类的构造

         -->初始化子类的非静态代码-->初始化子类的构造

 

     类只有在使用new调用创建的时候才会被java类装载器装入。

 

【final方法为何会高效】:

    final方法会在编译的过程中利用内嵌机制进行inline优化。

    inline优化是指:在编译的时候直接调用函数代码替换,而不是在运行时调用函数。

    inline需要在编译的时候就知道最后要用哪个函数,    

    显然,非final是不行的。

    非final方法可能在子类中被重写,由于可能出现多态的情况,编译器在编译阶段

    并不能确定将来调用方法的对象的真正类型,也就无法确定到底调用哪个方法。

 

【什么是多态】:

    按字面的意思是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。

    简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

 

【非final方法为什么会出现多态】:

    显然,如果派生出一个子类,覆盖非final方法,就会出现2个这样的方法可供调用,这就是多态。

 

【final变量的变与不变】:

    有人说final变量在赋值后就不可变,

    那么这个不变到底指的是什么呢?

    这个不变指的是引用,是地址,而所引用的对象的内容仍然是可变的。

    就是说,这个final变量永远指向某个对象,是一个常量指针,而不是指向常量的指针。

 

===========================================================================================

 

【final关键字的具体应用】:

    【final+变量】:

        在实际应用中,这种形式是非常少见的。

        比如logger是可以的,但是貌似并不是非常实用,或许用户仍然希望通过setter来改变logger变量。

    【static+final+变量】:

        常量。经常使用。

    【final+方法】:

        JDK中常用,但是自己并未常用。

    【final+类】:

        helper类经常使用。

    【final用于匿名内部类的参数传递】:

        在多线程测试时,经常使用。

    【final用于方法的参数】:

        并不常用。

分享到:
评论

相关推荐

    java final变量详解

    在变量中,final 变量只能被赋值一次,赋值后值不再改变。在方法中,final 方法不能被子类方法覆盖,但可以被继承。在类中,final 类不能被继承,没有子类,final 类中所有方法都是 final 的。 final 变量的内存...

    Java中final变量使用总结

    1. **final变量的声明** - 对于基本类型变量,如`int`、`double`等,一旦赋值,其值就不能更改。 ```java final double PI = 3.14; ``` - 对于对象引用,`final`变量只能指向一个对象,但对象内部的状态(非`...

    Java中final的深度剖析

    在Java 8引入的lambda表达式中,final变量可以作为lambda的捕获变量,这保证了lambda表达式的封闭性,即它们不能修改外部的非final变量。 总结来说,final关键字在Java编程中扮演了多种角色,从确保常量的不变性,...

    java中final和static的总结

    在Java编程语言中,`final` 和 `static` 是两个非常重要的关键字,它们分别具有不同的含义和用法,但都对代码的结构和行为产生深远影响。本文将深入探讨这两个关键字,并结合实际示例来解释它们的应用场景。 首先,...

    java 常量与变量

    在Java编程语言中,常量和变量是两个基础且重要的概念。它们是程序中存储数据的容器,理解它们的性质和用法对于编写高效的代码至关重要。 ### 常量 常量是固定不变的值,一旦被定义就不能再更改。在Java中,我们...

    java中final和static的区别

    final 关键字在 Java 中有多种用法,包括修饰变量、方法、类等。下面是 final 关键字的各种用法: 1. final 修饰变量:表示该变量一旦被初始化,程序无法修改变量的值,该变量变成了一个常量。注意,系统不会默认为...

    Java中的final关键字

    1. **final变量** - `final`修饰的局部变量一旦初始化后,就不能再改变其值。这有助于防止意外修改,增加代码的可预测性和安全性。 - 类级(静态)常量通常也用`final`修饰,例如`public static final`,这样的...

    深入理解Java中的final关键字_动力节点Java学院整理

    Java 中的 `final` 关键字是一个至关重要的概念,它被用来声明类、方法和变量,以确保它们在程序执行过程中不可更改。深入理解 `final` 关键字可以帮助开发者写出更加安全、高效的代码。 首先,`final` 关键字可以...

    java中final关键字和static关键字详细用法

    Java中的`final`和`static`关键字是编程中非常重要的两个修饰符,它们分别用于不同的场景,以确保代码的稳定性和高效性。 首先,`final`关键字主要用于表示不可变性。它可以用来修饰类、方法和变量。对于类,如果一...

    关于Java中final的深度剖析.pdf

    在Java中,final变量是一种常量,它的值不能被改变。final变量可以在编译时被初始化,也可以在运行时被初始化,但是一旦被初始化,final变量的值就不能被修改了。使用final变量可以提高代码的可读性和可维护性,因为...

    局部变量用final的讨论

    这是因为内部类可以访问外部类的final或effectively final变量,而这些变量被视为常量。 3. **代码优化**:JVM可能会对`final`局部变量进行优化,如逃逸分析,将它们存储在栈上而不是堆上,提高运行效率。 4. **...

    2023年快速学习Android开发那些必须掌握的知识点集锦.docx

    13. final 变量必须显式初始化:Java 中final 变量必须显式初始化,系统不会对final变量进行隐式初始化。 14. 字符串常量池:Java 中使用常量池来管理曾经用过的字符串直接常量,例如String a = "java",系统把常量...

    java中final与static的用法

    `final`关键字在Java中有多种用途,它可以用来修饰类、方法和变量,其主要目的是确保被修饰的对象具有不可变性或只读性。 #### 1. `final`修饰变量 当`final`用于修饰一个变量时,该变量成为常量,一旦赋值后就不...

    Java中final作用于变量、参数、方法及类该如何处理

    Java中的`final`关键字在编程中扮演着至关重要的角色,它用于确保代码的不可变性和确定性。在本文中,我们将深入探讨`final`在变量、参数、方法和类中的应用及其作用。 **1. `final`关键字用于变量** - **final...

    Java关键字final、static使用总结

    在 Java 编程语言中,final 和 static 是两个非常重要的关键字,它们可以用来修饰类、方法、变量等,了解它们的使用方法和限制非常重要。本文将详细总结 final 和 static 的使用方法和限制。 一、final 关键字 ...

    Java中final共2页.pdf.zip

    // 可以访问final变量 ``` 此外,`final`关键字在Java集合框架中也有特殊应用。例如,`final`数组可以与匿名内部类一起使用,因为它们在编译时被确定为常量。而`ArrayList`或`HashMap`等非`final`集合则无法直接在...

    java成员变量覆盖问题

    在Java编程语言中,成员变量是指定义在类中的变量,它们可以在类的方法、构造器或类的其他成员方法中访问和操作。成员变量的覆盖(有时会被误认为是“重写”)是理解Java继承机制的关键之一。本文将详细解释成员变量...

    java_中的_final_变量[文].pdf

    在Java编程语言中,`final`关键字扮演着重要的角色,它用于声明不可变的变量、方法和类。理解`final`的关键在于其不可变性,这有助于提高程序的效率、稳定性和设计规范。 首先,`final`变量表示常量,一旦赋值后就...

    Java中final的用法.doc

    在Java编程语言中,`final`关键字有着重要的作用,它用于标记一个变量、方法或类,表示不可变性。这个特性在多个方面都有应用,包括创建常量、确保引用不可变以及在多线程环境中提供安全。 1. **常量的创建**: `...

    Java final关键字

    在Java编程语言中,`final`关键字扮演着一个至关重要的角色,它被用来声明一个变量、方法或类为不可变的。在这个学习demo中,我们将深入理解`final`关键字的各种用法及其背后的原理。 首先,`final`关键字用于变量...

Global site tag (gtag.js) - Google Analytics