• final 成员变量的初始化问题;

1. 实现特别的约束和限制

  • 指向一个 static 型私有成员(仅调用一次),

    public class Coffee {
    
        private static long counter = 0;
    private final long id = counter++; public String toString() {
    return getClass().getSimpleName() + " " + id;
    }
    }

final 修饰的引用,不可以再指向别的引用,但 final 修饰的引用,其指向的对象,其值却可以修改,相当于常量指针(const int*,指针是常量,不可以再指向别的内存,指向的内存却可以继续修改),而不是指针常量(const* int)。

2. final 的作用

  • 防止其他人覆盖该方法;
  • 可以有效地关闭动态绑定,或者说告诉编译器不需要对其进行动态绑定;
    • 在 Java 中,除了 static 方法和 final 方法(private 方法属于 final 方法),其他所有的方法都是后期绑定(也叫动态绑定);
    • 绑定的含义即是:将一个方法调用同一个方法主体关联起来;
    • 动态绑定(后期绑定):在运行时根据对象的类型进行绑定;
      • Java 中的多态便是通过动态绑定实现的;

3. public final

public class Pair<K, V> {
public final K key;
public final V val;
public Pair<K, V>(K k, V v) {
key = k; val = v;
}
}
  • key 和 value,成员变量都是 public 和 final 的,是为了使 Pair 成为只读的数据传输对象(或信使);

4. 一些细节问题

  • private 方法属于 final 方法,final 方法在编译期即已绑定;

    public class PrivateOverride {
    private void f() {
    System.out.println("private f()");
    } public static void main(String[] args) {
    PrivateOverride p = new Derived();
    p.f();
    }
    } class Derived extends PrivateOverride {
    public void f() {
    System.out.println("public f()");
    }
    }

    期望输出 public f(),但由于 private 方法被自动认为是 final 的,且对导出类是屏蔽的。在此种情况下,Derived 类中的 f() 方法是一个全新的方法。只有非 private 方法才可以被覆盖,但还需要密切注意覆盖 private 方法的现象,这时虽然编译期不会报错,失去了多态机制,也不会按照所期望的来执行。因此,在派生类中,对于基类的 private 方法,最好采用不同的名字。

5. final 修饰对象引用(或数组)

final 修饰对象引用,并非说对象其自身不可被修改,而是对象引用恒定不变,也即一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象(对象本身却是可以被修改的,事实上,Java 并未提供使任何对象恒定不变的途径)。这一限制同样适用于数组,因数组也是对象。

来看 final 修饰这样一个简单的对象引用:

final Test t = new Test();
t.setValue(10); // 修改其内部成员变量的值,是被允许的;
t = new Test(); // final 修饰的对象引用,不可以再指向别的对象;

首先来看数组的例子

final 修饰对象引用,或者数组(数组也是一种引用),此对象引用不可以再指向别的对象。

final int[] b = {1,2};
b[1]++; // 允许,b[1] == 3,数组内部的元素可变
b = new int[3]; // 不允许,

java 语法 —— final的更多相关文章

  1. Java关键字final、static

    一.final根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final ...

  2. 【转】Java关键字final、static使用总结

    转自:http://lavasoft.blog.51cto.com/62575/18771/   Java关键字final.static使用总结   一.final        根据程序上下文环境, ...

  3. Java关键字final、static使用总结

    Java关键字final.static使用总结   一.final        根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方 ...

  4. 转!Java关键字final、static使用总结

    Java关键字final.static使用总结   一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可 ...

  5. Java关键字final、static使用总结(转)

    Java关键字final.static使用总结   一.final        根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方 ...

  6. (转)Java关键字final、static使用总结

    一.final  根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. fin ...

  7. [Java] 关键字final、static使用总结

    一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率.final ...

  8. 【JAVA】final修饰Field

    一.简介 final修饰符可以用来修饰变量.方法.类.final修饰变量时一旦被赋值就不可以改变. 二.final成员变量 成员变量是随类初始化或对象初始化而初始化的.当类初始化的时候,会给类变量分配 ...

  9. java 关键字final static native详解

    java 关键字native static final详解 一.final 根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的"含义, ...

随机推荐

  1. JS——事件冒泡与捕获

    事件冒泡与事件捕获 1.冒泡:addEventListener("click",fn,false)或者addEventListener("click",fn): ...

  2. SQL基本操作——UNION

    UNION 操作符:用于合并两个或多个 SELECT 语句的结果集.请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 SELECT 语句中的列 ...

  3. 体验SqlServer Express 2014

    想使用SQLServer Express记录一些数据,但使用起来并不令人愉快.SQLServer Express是一个免费的可用数据库,但似乎设置了一些门槛,多少显得并不真心实意.抛开版本(技术)限制 ...

  4. zxing 生成条形码

    private Bitmap Out1DImg() { // 1.设置条形码规格 EncodingOptions encodeOption = new EncodingOptions(); encod ...

  5. 扩增子分析QIIME2-4分析实战Moving Pictures

    本示例的的数据来自文章<Moving pictures of the human microbiome>,Genome Biology 2011,取样来自两个人身体四个部位五个时间点   ...

  6. js案例分析

    名字取的高大上,其实只是我平时上网浏览遇到的一些我感觉还不错的小题目,再加上我或者是我在网上找到的一些理解,就保存到这里了. 2019/4/2  最新开了个新坑,是一个javascipt30的一些案例 ...

  7. 用R语言 画条形图(基于ggplot2包)

    1.用qplot(x,data=data,geom.=”bar”,weight=y)+scale_y_continuous("y")画出y关于x的条形. 图中提示binwidth这 ...

  8. GIT的API主要应用示例

    这几个简单的API应用,主要是通过TOKEN来获取GIT内空的例子. 但在获取GIT的文件列表时,要注意区分目录和文件的MODE差别( 100644 普通文件 040000 普通目录 ). impor ...

  9. K - Count the string kmp_Next数组应用

    It is well known that AekdyCoin is good at string problems as well as number theory problems. When g ...

  10. CODEVS——T 1049 棋盘染色

    http://codevs.cn/problem/1049/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descr ...