final关键字思想

java的关键字final的含义通常指“这是无法改变的”,不想改变出于两种理由。
1、设计。
2、效率
谈论一些用到final的三种情况。数据、方法和类

1、数据

有时候数据恒定不变是由意义的,
例如1 一个永不改变编译时的常量。
例如2:一个在运行时被初始化的值,而你不希望它被改变。
在java中这些常量必须是基本类型,以关键字final表示。在编译时执行计算,减轻运行时负担。对基本类型final使数值恒定不变。而对于对象引用,final使引用恒定不变,但是对象自身是可以修改的,java并没有提供对象恒定不变的途径。
即是static又是final的域,将用大小表示,并使用下划线分割单词。

package pdmtest.cl;

public class FinalData {
    // Can be compile-time constants
    final int i1 = 9;
    static final int I2 = 99;
    // Typical public constant:
    public static final int I3 = 39;
    // Cannot be compile-time constants:
    final int i4 = (int) (Math.random() * 20);
    static final int i5 = (int) (Math.random() * 20);
    Value v1 = new Value();
    
    final Value v2 = new Value();
    static final Value v3 = new Value();
    // ! final Value v4; // Pre-Java 1.1 Error:
    // no initializer
    // Arrays:
    final int[] a = { 1, 2, 3, 4, 5, 6 };

    public void print(String id) {
        v3.i = (int) (Math.random() * 20);
        v2.i = (int) (Math.random() * 20);
        System.out.println(id + ": " + "i4 = " + i4 + ", i5 = " + i5+ ", v3 = "+v3.i+ ", v2 = "+v2.i);
    }

    public static void main(String[] args) {
        FinalData fd1 = new FinalData();
        // ! fd1.i1++; // Error: can't change value
        fd1.v2.i++; // Object isn't constant!
        fd1.v1 = new Value(); // OK -- not final
        for (int i = 0; i < fd1.a.length; i++)
            fd1.a[i]++; // Object isn't constant!
        // ! fd1.v2 = new Value(); // Error: Can't
        // ! fd1.v3 = new Value(); // change handle
        // ! fd1.a = new int[3];
        fd1.print("fd1");
        FinalData fd2 = new FinalData();
        fd1.print("fd1");
        fd2.print("fd2");
    }
}

output
fd1: i4 = 18, i5 = 9, v3 = 2, v2 = 18
fd1: i4 = 18, i5 = 9, v3 = 17, v2 = 5
fd2: i4 = 2, i5 = 9, v3 = 3, v2 = 6

空白final

Java 1.1 允许我们创建“空白final”,它们属于一些特殊的字段。尽管被声明成final,但却未得到一个
初始值。无论在哪种情况下,空白final 都必须在实际使用前得到正确的初始化。


class Poppet { }
class BlankFinal {
final int i = 0; // Initialized final
final int j; // Blank final
final Poppet p; // Blank final handle
// Blank finals MUST be initialized
// in the constructor:
BlankFinal() {
j = 1; // Initialize blank final
p = new Poppet();
}
BlankFinal(int x) {
j = x; // Initialize blank final

p = new Poppet();
}
public static void main(String[] args) {
BlankFinal bf = new BlankFinal();
}
} ///:~

现在强行要求我们对final 进行赋值处理——要么在定义字段时使用一个表达 式,要么在每个构建器中

final参数

java允许在参数列表中以声明的方式将参数指明为final,意味着你无法改变参数引用所指向的对象。

package pdmtest.cl;
public class FinalArguments {

    void with(final Gizmo g){
        //g = new Gizmo();//final object 不可以赋值
        
    }
    
    void f(final int i){
        //i=2;不可以赋值
    }
    
    int g(final int x){
        return x+1;
    }
    
    public static void main(String[] args) {
        FinalArguments f = new FinalArguments();
        System.out.println(f.g(1));
        Gizmo g = new Gizmo();
        f.with(g);
    }
}

这一特性主要是向匿名内部类传递数据。

final方法

使用final方法有两个原因。

第一个原因把方法锁定,防止任何类修改它的含义。出于设计考虑。

第二个原因是效率。将方法指明给final就是同意编译器针对该方法的所有调用都转为内嵌调用。

final类

当将某个类设计为final时,表明你不打算集成该类,而且也不允许别人这么做。

将类定义成final 后,结果只是禁止进行继承——没有更多的限制。然
而,由于它禁止了继承,所以一个final 类中的所有方法都默认为final

package pdmtest.cl;

class SmallBrain {
}

final class Dinosaur {
    int i = 7;
    int j = 1;
    SmallBrain x = new SmallBrain();

    void f() {
    }
}

// ! class Further extends Dinosaur {}
// error: Cannot extend final class 'Dinosaur'
public class Jurassic {
    public static void main(String[] args) {
        Dinosaur n = new Dinosaur();
        n.f();
        n.i = 40;
        n.j++;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,873评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,483评论 1 306
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,525评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,595评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,018评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,958评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,118评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,873评论 0 208
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,643评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,813评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,293评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,615评论 3 262
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,306评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,170评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,968评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,107评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,894评论 2 278

推荐阅读更多精彩内容

  • Advanced Language Features 知识点:一. static修饰符 static修饰符可以用来...
    风景凉阅读 391评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,297评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,110评论 18 139
  • (一)什么情况下我们要使用static呢?1、只想用一个存储区域来保存一个特定的数据——无论要创建多少个对象,甚至...
    晨曦_hero阅读 482评论 0 0
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,663评论 0 33