zoukankan      html  css  js  c++  java
  • 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变量:

      在声明final变量时就对齐初始化,这是最常用的初始化方式。当一个final变量在声明的时候没有被初始化,这个变量就被成为blank final变量,那么下面的两种方法就是初始化一个blank final变量

      blank final变量可以由instance-initializer代码块或者构造函数进行初始化。如果有多个构造函数,那么这个blank final变量必须在每一个构造函数中都要进行初始化,否则编译时报错。

      一个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 + " ");

      }郑州男科医院:http://nkmobile.zztjyy.com/郑州男科医院哪家好:http://nkmobile.zztjyy.com/郑州同济做包皮手术多少钱:http://nkmobile.zztjyy.com/

      }

      //输出:1 2 3

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

      final类

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

      定义一个final类来阻止其他类继承,因为final类是无法被扩展的,比如所有的封装类Integer,Float等都是final类

      另一种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");

      }

  • 相关阅读:
    css常见小问题(个人的积累总结)
    YQBlogs1.2的解读与使用VS2012&LocalDB版本(跟进贴)
    asp.net mvc 用自定义的RazorViewEngine实现主题的自由切换遇到的问题!
    求解?命令行下操作LocalDb的诸多问题
    CentOS7下docker安装
    IIS 应用程序池设置,避免IIS假死
    .NET 将数据输出到WORD、EXCEL、TXT、HTM
    iframe高度动态自适应
    .net利用SQLBulkCopy进行数据库之间的大批量数据传递
    Datatable.Select()用法简介
  • 原文地址:https://www.cnblogs.com/sushine1/p/11578936.html
Copyright © 2011-2022 走看看