• Java之final关键字


    1、final类

        final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时若不需要有子类,类的实现细节不允许改变,并且确信不会再被扩展,那么就设计为final类。

    2、final方法

        如果类的某个方法不允许子类覆盖,则可以把该方法声明为final方法。使用final方法的原因有二:
    第一、把方法锁定,防止任何继承类修改它的意义和实现。
    第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。

    3、final变量(常量)

        final修饰的成员变量表示常量,值一旦给定就无法改变!其修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。一旦给final变量初值后,值就不能再改变了。
        另外,final变量定义的时候,可以先声明而不给初值,这使得一个类中的final类型成员可以实现依对象而有所不同,却又保持其恒定不变的特征。【前提是,编译器必须确保final数据在使用之前被初始化

    4、final参数

        当函数参数为final类型时,允许读取参数,但无法修改参数值。

    拓展学习

    内部类访问方法参数必须添加final修饰符

    public void mRun(final String name) {
    new Thread(new Runnable() {
    @Override
    public void run() {
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    System.out.println(name);
    }
    }).start();
    }
    name变量添加final修饰符的原因分析:
    此时内部类的生命周期是成员级别的,而局部变量的生命周期实在方法体之类。此时会出现一种特殊情况,
    mRun方法执行完之后,此时name变量已经不再内存当中,但线程中依旧需要name变量。为杜绝该种情况,Java严格要求内部类中访问局部变量,必须使用final关键字修饰,此时会在内存中保有一份局部变量的复制品,内部类访问时便访问这个复制品。

    final修饰的变量表示只允许实例化一次

    final FinalEntity entity = new FinalEntity("王俊", 23, new Student());
    lg.e(entity.toString());
    entity.str = "新的任务";
    entity.stu = new Student();
    entity.intValue = 100;
    lg.e(entity.toString());
    entity=new FinalEntity("新的Str",99,new Student());//编译错误
    运行结果如下分析可知,final修饰的变量仅可实例化一次,但其内部的成员变量可任意修改(即使这里修改FinalEntity类为final)。


    附上FinalEntity源码如下
    public class FinalEntity {
    public String str;
    public Integer intValue;
    public Student stu;

    public FinalEntity(String str, Integer intValue, Student stu) {
    this.str = str;
    this.intValue = intValue;
    this.stu = stu;
    }

    @Override
    public String toString() {
    return super.toString() + "***" + str + "***" + intValue + "***" + stu.toString();
    }
    }





  • 相关阅读:
    Jing : 记录屏幕上的图像、录像,拿来与朋友共享
    VistaDB 数据库,.NET的新选择
    获取指定网站的屏幕抓图
    XOOXML 操控 Excel 2007的组件
    MySQL 的一个奇怪错误
    又一个.NET代码生成器
    A .NET API for the Google Maps Geocoder
    ASP.NET + MySQL 开发笔记 MembershipProvider 和 RoleProvider 用法
    Educational Codeforces Round 96 (Rated for Div. 2)
    Codeforces Round #676 (Div. 2)
  • 原文地址:https://www.cnblogs.com/linux007/p/5777982.html
Copyright © 2020-2023  润新知