Java之final关键字解析

Java之final关键字解析

final关键字可以修饰不同的内容,这些内容仅包括一个变量,一个方法或者一个类,以下是final修饰这些内容的作用:

  • final变量:表示该变量为常量,即只能初始化一次
  • final方法:表示该方法不能被重写
  • final类:表示该类不可以被继承

final变量

当一个变量被final关键字修饰时,意味着它的值不可以被修改了,也就是说,这个变量表示一个常量。这也意味着final变量必须被初始化。如果一个final变量表示的是一个对象的引用,那么该变量就不能重新表示另一个对象的引用了,但是这个final变量指向的对象的内部状态是可以改变的,例如,我们可以向一个final array或者final collection中增加或者删除元素。另外,使用大写字母和下划线表示一个final变量是个好习惯。

Examples

// a final variable
final int THRESHOLD = 5;
// a blank final variable
final int THRESHOLD;
// a final static variable PI
static final double PI = 3.141592653589793;
// a  blank final static  variable
static final double PI;

初始化一个final变量

我们必须初始化一个final变量,否则编译器将会抛出错误。一个final变量只能被初始化一次,可以通过初始化器或者初始化语句对其进行初始化。有三种方法可以初始化一个final变量:

  1. 在声明final变量时就对齐初始化,这是最常用的初始化方式。当一个final变量在声明的时候没有被初始化,这个变量就被成为blank final变量,那么下面的两种方法就是初始化一个blank final变量
  2. blank final变量可以由instance-initializer代码块或者构造函数进行初始化。如果有多个构造函数,那么这个blank final变量必须在每一个构造函数中都要进行初始化,否则编译时报错。
  3. 一个blank final static变量可以在内部static代码块中初始化

Examples

//初始化final变量的方法
class Test {
    //直接初始化
    final int THRESHOLD = 5;
    //blank final变量
    final int CAPACITY;
    final int MAXMUM;
    //blanck static final变量
    static final int MINIMUM;
    //使用初始化器
    {
        CAPATICY = 25;
    }
    //使用static代码块
    static {
        MAXMUM = 125;
    }
    //使用构造函数
    public Test() {
        MINIMUM = -1;
    }
}

什么时候需要使用final变量

一个普通变量和一个final变量之间唯一的区别就是一旦给final变量赋值,则该变量的值将不可以再被改变。因此,final变量只能用于我们希望在整个程序执行过程中保持不变的值。

final变量的值是对象的引用

当一个final变量是一个对象的引用,我们把这个变量称为引用final变量(reference final variable),例如一个StringBuffer的final变量可以是final StringBuffer sb,我们知道一个final变量是不可以再重新赋值的,但是这个final变量指向的对象的内部状态是可以改变的,这种final属性可以称为非传递性。

Examples

class Test
{
    public static void main(String[] args)
    {
        // a final reference variable sb
        final StringBuilder sb = new StringBuilder("Test");
        System.out.println(sb);
        // changing internal state of object
        // reference by final reference variable sb
        sb.append("ForTest");
        System.out.println(sb);
    }
}
//输出为:
//Test
//TestForTest

Note

a. final变量不能重新赋值,否则出现编译错误

b. 局部final变量必须在其创建后就对其进行赋值

c. 对比C++的const变量,const变量在声明的时候就需要赋初值,而final变量可以先声明再赋值,但只能赋值一次

d. foreach循环中,final修饰变量是合法的,栗子如下

// Java program to demonstrate final
// with for-each statement
class Test
{
    public static void main(String[] args)
    {
        int arr[] = {1, 2, 3};
        // final with for-each statement
        // legal statement
        for (final int i : arr)
            System.out.print(i + " ");
    }
}
//输出:1 2 3

这里可以这样使用的原因是每次迭代时相当于重新对i进行了声明

final类

final类无法被继承,有两种使用情况:

  1. 定义一个final类来阻止其他类继承,因为final类是无法被扩展的,比如所有的封装类Integer,Float等都是final类
  2. 另一种final类是创建一个不可变类,像预定义的String类,如果不使用final关键字我们是无法创建一个不可变类的

final方法

一个被final修饰的方法是无法被重载的,对于一个含有final方法的父类,在其派生类中该方法必须和父类中的方法保持相同的实现

Example

class A
{
    final void m1()
    {
        System.out.println("This is a final method.");
    }
}

class B extends A
{
    void m1()
    {
        // COMPILE-ERROR! Can‘t override.
        System.out.println("Illegal");
    }
}

原文地址:https://blog.51cto.com/acevi/2439073

时间: 2024-10-12 22:24:37

Java之final关键字解析的相关文章

聊聊Java的final关键字

Java的final关键字在日常工作中经常会用到,比如定义常量的时候.如果是C++程序员出身的话,可能会类比C++语言中的define或者const关键字,但其实它们在语义上差距还是挺大的. 在Java中,final可以用来修饰类.方法和变量(包括成员变量和局部变量).我们先来简单介绍一下final关键字的这几个用法. 一.final修饰类 常见的一个例子就是String类.当用final修饰一个类时,表明这个类不能被继承,并且final类中的所有成员方法都会被隐式地指定为final方法,但成员

关于Java中final关键字的用法总结

用于数据 永不改变的编译时常量,必须是基本类型,static final常量定义时必须赋值 一个运行时被初始化却又不希望被改变的值 空白final,确保使用前必须被初始化,但有更大的灵活性 final参数,用于对象引用,对象不可改变,用于基本类型,值不可以改变 用于方法 防止方法的行为被改变,不可覆盖 private方法默认为final的 曾经使用final方法可以提高效率,现已不提倡 用于类 表示该类不可以被继承 final类方法默认指定为final的 关于Java中final关键字的用法总结

Java之final关键字

1.final类 final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的.在设计类时若不需要有子类,类的实现细节不允许改变,并且确信不会再被扩展,那么就设计为final类. 2.final方法 如果类的某个方法不允许子类覆盖,则可以把该方法声明为final方法.使用final方法的原因有二: 第一.把方法锁定,防止任何继承类修改它的意义和实现. 第二.高效.编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率. 3.final变量(常量) final

Java之final的解析

在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量). 当用final修饰一个类时,表明这个类不能被继承. 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改:如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象. final修饰的成员变量,必须在定义时或者构造函数中初始化赋值,而且一旦赋值则不能改变. 当一个变量被定义成final 类型时,在编译时能知道其确切的值,则被当成常量使用. final String a =

final关键字解析&匿名内部类形参用final

谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字,另外,Java中的String类就是一个final类.一.final关键字的基本用法在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).1.修饰类当用final修饰一个类时,表明这个类不能被继承.也就是说,如果一个类你永远不会让它被继承,就可以用final进行修饰.final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定

Final关键字解析

final 在 Java 中是一个保留的关键字,可以声明变量.方法.类. 什么是final变量 / 类 / 方法? 任何变量前被 final 修饰就是 final 变量,定义的类前被 final 修饰就是 final 类,任何方法前被 final 修饰就是final方法. 一.final类 ? 当用 final 修饰一个类时,表明这个类不能被继承.图中箭头指向的地方,那句英文翻译过来就是不能继承 Cat 类. 如果把 final 关键字去掉,就可以了.这样就不会报错了! ? 使用final类要注

java 对 final 关键字 深度理解

基础理解 : 1.修饰类 当用final去修饰一个类的时候,表示这个类不能被继承.处于安全,在JDK中,被设计为final类的有String.System等,这些类不能被继承 .注意:被修饰的类的成员可以是final修饰,可可以不是 . 2.修饰方法 : 方法不能被子类重写.常用在类设计时不希望被子类重写而修饰. 3.修饰方法参数 : 被修饰 的参数变量,不能在方法体内再次被赋值.这个好像是站在调用者的角度考虑的哈,就好像有个大佬拿了把菜刀给我,叫我去看人 ,大佬说,你一定要用这把菜刀去砍,不要

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

在Java5中,final关键字是非常重要而事实上却经常被忽视其作为同步的作用.本质上讲,final能够做出如下保证:当你创建一个对象时,使用final关键字能够使得另一个线程不会访问到处于"部分创建"的对象,否则是会可能发生的.这是 因为,当用作对象的一个属性时,final有着如下的语义: 当构造函数结束时,final类型的值是被保证其他线程访问该对象时,它们的值是可见的 为什么是必须的 使用final是所谓的安全发布(safe publication)的一种方式,这里,发布(pub

java里final关键字

final关键字可用于修饰类.变量和方法,它有"无法改变"或者"最终"的含义,因此被final修饰的类.变量和方法将具有以下特性: ? final修饰的类不能被继承. ? final修饰的方法不能被子类重写. ? final修饰的变量(成员变量和局部变量)是常量,只能赋值一次. 原文地址:https://www.cnblogs.com/wangjiong/p/9763240.html