文章内容源于对《疯狂java讲义》及《疯狂Java:突破程序员基本功的16课》学习和总结。

一、 final成员变量

final 修饰变量时,表示该变量一旦获取了值就不可以改变了。

但是我们知道,当一个类被加载,或者是实例化对象时,系统会为类成员赋初始值,所以,final关键字修饰的成员变量,必须有程序员指定初始值,一旦指定了初始值,就不可以再改变。

其初始化可以在两个地方:

类Field:必须在声明该变量时或静态初始化快中指定初始值。

实例Field: 必须在非静态初始化块、声明该Field或构造器中指定初始值。

示例:

public class FinalVariableTest
{
//定义成员变量时指定默认值,合法。
final int a = 6;
//下面变量将在构造器或初始化块中分配初始值
final String str;
final int c;
final static double d;
//既没有指定默认值,又没有在初始化块、构造器中指定初始值,
//下面定义char Field是不合法的。
//final char ch;
//初始化块,可对没有指定默认值的实例Field指定初始值
{
//在初始化块中为实例Field指定初始值,合法
str = "Hello";
//定义a Field时已经指定了默认值,
//不能为a重新赋值下面赋值语句非法
//a = 9;
}
//静态初始化块,可对没有指定默认值的类Field指定初始值
static
{
//在静态初始化块中为类Field指定初始值,合法
d = 5.6;
}
//构造器,可对既没有指定默认值、有没有在初始化块中
//指定初始值的实例Field指定初始值
public FinalVariableTest()
{
//如果初始化块中对str指定了初始化值,
//构造器中不能对final变量重新赋值,下面赋值语句非法
//str = "java";
c = 5;
}
public void changeFinal()
{
//普通方法不能为final修饰的成员变量赋值
//d = 1.2;
//不能在普通方法中为final成员变量指定初始值
//ch = 'a';
}
public static void main(String[] args)
{
FinalVariableTest ft = new FinalVariableTest();
System.out.println(ft.a);
System.out.println(ft.c);
System.out.println(ft.d);
}
}

编译运行结果:

6

5

5.6

二、 final局部变量

对于使用final修饰局部变量,即可以在定义时指定默认值,也可以不指定默认值;

如果一旦赋了初始值,则之后都不可以再修改变量值。

public class FinalLocalTest
{
public static void main(String[] args)
{
//定义一个普通局部变量
final int a = 5;
System.out.println(a);
}
}

三、 内部类中的局部变量

另外方法中的内部类在用到方法中的参变量时,此参变也必须声明为final才可使用:

public class INClass {
   void innerClass(final String str) {
         class IClass {
                  IClass() {
                     System.out.println(str);
                  }
         }
         IClass ic = new IClass();
   }   public static void main(String[] args) {
       INClass inc = new INClass();
       inc.innerClass("Hello");
  }
}

四、 final宏替换

final有一个很重要的概念,就是宏替换;宏替换的应当满足的条件:

· 使用final修饰符修饰变量

· 在定义该final变量时只定了初始值

· 该初始值可以在编译时就被确定下来。

public class FinalLocalTest {
   public static void main(String[] args) {
      // 定义一个普通局部变量
      final int a = 5;
      System.out.println(a);
   }
}

总结:

1.  final修饰基本类型和引用类型有所不同,final修饰基本类型变量时,只要基本类型被赋初始值,则不可改变; 但final修饰引用类型时,引用的地址不可改变,但是引用的值是可以改变的。

2.  final执行宏替换时,在程序运行过程中,有替换的值直接参与程序的执行,而并非变量。

3. final修饰的方法不可重写,修饰的类不可继承。

深入java面向对象二:final关键字的更多相关文章

  1. 面向对象编程(十二)——final关键字

    final关键字 Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量. 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和 ...

  2. 浅析Java中的final关键字(转载)

    自http://www.cnblogs.com/dolphin0520/p/3736238.html转载 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括 ...

  3. 浅析Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  4. [转载]浅析Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  5. 转载:浅析Java中的final关键字

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...

  6. java中的final关键字

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...

  7. 浅析Java中的final关键字(转)

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...

  8. Java基础(三)-final关键字分析

    今天来谈谈final关键字的作用, 虽然有很多博文关于final进行了很深的研究,但还是要去记录下谈谈自己的见解加深下印象.下面直接进入主题: 一.final关键字的作用 1.被final修饰的类不能 ...

  9. 简单聊聊java中的final关键字

    简单聊聊java中的final关键字 日常代码中,final关键字也算常用的.其主要应用在三个方面: 1)修饰类(暂时见过,但是还没用过); 2)修饰方法(见过,没写过); 3)修饰数据. 那么,我们 ...

  10. 浅谈Java中的final关键字

    浅谈Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

随机推荐

  1. Spring Boot → 09:使用外置Servlet容器_tomcat9.0

    Spring Boot → 09:使用外置Servlet容器_tomcat9.0

  2. oralce管理命令

    Emctl start agent TZ set to PRC Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0 Co ...

  3. Leetcode876.Middle of the Linked List链表的中间节点

    给定一个带有头结点 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 示例 1: 输入:[1,2,3,4,5] 输出:此列表中的结点 3 (序列化形式:[3,4 ...

  4. Centos7搭建Django出现的问题(Centos7+Django1.11.1+Nginx+uwsgi)

    出现的问题: 1.pip未安装:http://www.cnblogs.com/fnng/p/3737964.html 2.安装uwsgi失败,因为未安装python-devel yum search ...

  5. .net WebServer示例及调用(接口WSDL动态调用 JAVA)

    新建.asmx页面 using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...

  6. Beetl 3中文文档 转载 http://ibeetl.com/guide/

    Beetl作者:李家智(闲大赋) <xiandafu@126.com> 1. 什么是Beetl 广告:闲大赋知识星球,付费会员 Beetl( 发音同Beetle ) 目前版本是3.0.7, ...

  7. Vim学习与总结

    1. :w 后面可以加文件名 2. 使用hjkl 来移动光标,当然你也可以使用箭头.j就是向下的箭头,k是向上,h向左, l向右 3.  :help <command> → 显示相关命令的 ...

  8. docker-compose进入容器出现unable to find user root: no matching entries in passwd file

    解决办法: 先docker-compose stop 容器,再docker-compose start 容器.虽然这样可以很快 解决问题,但并非长久之计.

  9. Project configuration is not up-to-date with pom.xml. Run Maven->Update Project or use Quick Fix

    版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处.谢谢. https://blog.csdn.net/testcs_dn/article/details/ ...

  10. Effective C++: 03资源管理

    所谓资源,就是一旦用了它,将来必须还给系统.C++中的资源有:内存.文件描述符.互斥锁.数据库连接.网络socket等. 13:以对象管理资源 1:像下面这个函数: void f() { Invest ...