final关键字

根据上下文环境,Java 的关键字 final 的含义有些微的不同,但通常它指的是“这是不能被改变的”。防止改变有两个原因:设计或效率。因为这两个原因相差很远,所以有可能误用关键字 final

以下几节讨论了可能使用 final 的三个地方:数据、方法和类。

1)final 数据

对于编译时常量这种情况,编译器可以把常量带入计算中,可以减少了一些运行时的负担。在 Java 中,这类常量必须是基本类型,而且用关键字 final 修饰。你必须在定义常量的时候进行赋值。

带有恒定初始值的 final static 基本变量(即编译时常量)命名全部使用大写,单词之间用下划线分隔。

一个被 staticfinal 同时修饰的属性只会占用一段不能改变的存储空间。

当用 final 修饰对象引用而非基本类型时,

  • 对于基本类型,final 使数值恒定不变。
  • 对于对象引用,final 使引用恒定不变。

一旦引用被初始化指向了某个对象,它就不能改为指向其他对象。但是,对象本身是可以修改的,Java 没有提供将任意对象设为常量的方法。(你可以自己编写类达到使对象恒定不变的效果)这一限制同样适用数组,数组也是对象。

示例:

import java.util.*;

class Value {
    int i;
    Value(int i) {
        this.i = i;
    }
}

/**
 * @author Limh
 */
public class FinalData {
    private static Random rand = new Random(47);
    private String id;

    public FinalData(String id) {
        this.id = id;
    }
    private final int valueOne = 9;
    private static final int VALUE_TWO = 99;
    public static final int VALUE_THREE = 39;
    private final int i4 = rand.nextInt(20);
    static final int INT_5 = rand.nextInt(20);
    private Value v1 = new Value(11);
    private final Value v2 = new Value(22);
    private static final Value VAL_3 = new Value(33);
    private final int[] a = {1, 2, 3, 4, 5, 6};

    @Override
    public String toString() {
        return id + ": " + "i4 = " + i4 + ", INT_5 = " + INT_5;
    }

    public static void main(String[] args) {
        FinalData fd1 = new FinalData("fd1");
        //v2=new Value(22);
        fd1.v2.i++;
        fd1.v1 = new Value(9);
        //a.length = 6
        for (int i = 0; i < fd1.a.length; i++) {
            fd1.a[i]++;
        }
        System.out.println(fd1);
        System.out.println("Creating new FinalData");
        FinalData fd2 = new FinalData("fd2");
        System.out.println(fd1);
        System.out.println(fd2);
    }
}

输出:

fd1: i4 = 15, INT_5 = 18
Creating new FinalData
fd1: i4 = 15, INT_5 = 18
fd2: i4 = 13, INT_5 = 18

因为第一个变量和第二个变量都是带有编译时值的 final 基本类型,它们都可用作编译时常量,没有多大区别。第三个变量是一种更加典型的常量定义的方式:public 意味着可以在包外访问,static 强调只有一个,final 说明是一个常量。

正如你在 main() 中所见,v2final 的并不意味着你不能修改它的值。因为它是引用,所以只是说明它不能指向一个新的对象。

2)空白final

空白 final 指的是没有初始化值的 final 属性。

编译器确保空白 final 在使用前必须被初始化。这样既能使一个类的每个对象的 final 属性值不同,也能保持它的不变性。

你必须在定义时或在每个构造器中执行 final 变量的赋值操作。这保证了 final 属性在使用前已经被初始化过。

3)final参数

在参数列表中,将参数声明为 final 意味着在方法中不能改变参数指向的对象或基本变量:

class Gizmo {
    public void spin() {

    }
}

/**
 * @author Limh
 */
public class FinalArguments {
    void with(final Gizmo g) {
        //-g = new Gizmo();
        // Illegal -- g is final
    }

    void without(Gizmo g) {
        g = new Gizmo(); // OK -- g is not final
        g.spin();
    }

    //void f(final int i) { i++; } // Can't change
    // You can only read from a final primitive
    int g(final int i) {
        return i + 1;
    }

    public static void main(String[] args) {
        FinalArguments bf = new FinalArguments();
        bf.without(null);
        bf.with(null);
    }
}

4)final方法

使用 final 方法的原因有两个。

  1. 给方法上锁,防止子类通过覆写改变方法。这是出于继承的考虑,确保方法的行为不会因继承而改变。
  2. 只有在为了明确禁止覆写方法时才使用 final

5)final和private

类中所有的 private 方法都隐式地指定为 final。因为不能访问 private 方法,所以不能覆写它。

6)final类

当说一个类是 finalfinal 关键字在类定义之前),就意味着它不能被继承。之所以这么做,是因为类的设计就是永远不需要改动,或者是出于安全考虑不希望它有子类。

由于 final 类禁止继承,类中所有的方法都被隐式地指定为 final,所以没有办法覆写它们。你可以在 final 类中的方法加上 final 修饰符,但不会增加任何意义。

编写不易,转载注明出处:https://www.cnblogs.com/lmh15054109/p/14306823.html

(0)

相关推荐

  • Android bytes与KB、MB、GB单位转换

    Android bytes与KB、MB、GB单位转换

  • final关键字在PHP中的使用

    final关键字的使用非常简单,在PHP中的最主要作用是定义不可重写的方法.什么叫不可重写的方法呢?就是子类继承后也不能重新再定义这个同名的方法. class A { final function t ...

  • [PHP小课堂]final关键字在PHP中的使用

    [PHP小课堂]final关键字在PHP中的使用 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[xiaoyuezigonggong/149844827]免费得PHP.项目管理学习资料 ...

  • 23 final关键字(完结器)

    23 final关键字(完结器) 本质 不可以被修改--------定义的都是最终版本 //记住final和abstract是死对头,不能同时出现在一个类或一个方法上 常规用法 1.修饰类(无法被继承 ...

  • java中final关键字的作用

    final关键字可以用于三个地方.用于修饰类.类属性和类方法. 被final关键字修饰的类不能被继承,被final关键字修饰的类属性和类方法不能被覆盖(重写): 对于被final关键字修饰的类属性而言 ...

  • 深入理解 Java 中的 final 关键字

    final 是Java 中重要关键字之一,可以应用于类.方法以及变量上.这篇文章中将讲解什么是 final 关键字?将变量.方法和类声明为 final 代表了什么?使用 final 的好处是什么? f ...

  • [Android]【安卓】【Java】final关键字

    [Android][安卓][Java]final关键字 ME: 1.final修饰的类:不可被继承. 2.final修饰的方法:不可被重写. 3.final修饰的变量:初始化后的值不可改变.成员变量和 ...

  • 关于java中final关键字与线程安全性

    翻译自http://www.javamex.com/tutorials/synchronization_final.shtml 在Java5中,final关键字是非常重要而事实上却经常被忽视其作为同步 ...

  • Java中的关键字——final

    final是Java中的一个关键字,主要表示"最终态,最终的,不可修改"的意思:它可以修饰Java中的类,方法,属性等. 一. final类: 当final修饰Java中的类的时候 ...

  • Excel批量删除指定关键字Sheet名称的工作表,助力办公效率提升

    Excel情报局 Excel职场联盟 生产搬运分享Excel基础技能 Excel爱好者大本营 用1%的Excel基础搞定99%的职场问题 做一个超级实用的Excel公众号 Excel是门手艺玩转需要勇 ...