当前位置:首页 > Java技术 > 重新精读《Java 编程思想》系列之final关键字

重新精读《Java 编程思想》系列之final关键字

2022年09月17日 10:08:35Java技术8

在java中final关键字标识无法被修改。接下来从final修饰数据、方法和类进行介绍。

final数据

final用来告知编译器这一块数据是恒定不变的。数据恒定不变又如下作用:
1、一个永不改变的编译时常量。
2、一个在运行时被初始化的值,而你不希望他改变。
编译器常量的情况,编译器可以将常量值代入任何可能用到的计算式,可以在编译时,执行计算式,减轻运行的负担。这类常量必须是基本数据类型,并且以关键字final表示。常量在定义的时候,必须对其进行赋值。一个即是static又是final的域占据一段不能改变的存储空间。
重新精读《Java 编程思想》系列之final关键字 _ JavaClub全栈架构师技术笔记
如果不赋初值,编译器会报错提示。
当final修饰对象引用的时候,final使对象的引用恒定不变,一旦引用被初始化指向一个对象,就无法再把它指向另一个对象。然而对象的自身是可以修改的。
重新精读《Java 编程思想》系列之final关键字 _ JavaClub全栈架构师技术笔记
像以上代码,可以看出改变引用的时候,编译器会报错提示,但是当改变引用对象的内部属性的时候,就没有问题。

空白final

java允许生产空白final,指被声明为final,但又未给定初值的域,无论什么情况,编译器确保空白final在使用前必须被初始化。空白fianl的作用可以做到根据对象的不同而有所不同,却又保持其恒定不变的特性。

class Poppet{
    private int i;
    Poppet(int ii){
        i = ii;
    }
}

public class BlankFinal {
    private final int i = 0;
    private final int j;
    private final Poppet p ;

    public BlankFinal(){
        j =1 ;
        p = new Poppet(1);
    }

    public BlankFinal(int x){
        j = x;
        p = new Poppet(x);
    }

    public static void main(String[] args) {
        new BlankFinal();
        new BlankFinal(20);
    }
}

当我们定义空白的final的时候,必须保证在构造器的时候对值进行初始化。如上面的代码,假如我们没有在构造器中对其进行初始化,则会报错。

final参数

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

void with(final Gizmo g){
    g= new Gizmo();
}

如上代码是不可以的,因为final的类型不可以进行更改。

void f(final int i){
    i++;
}

如上也是不可以的。

void f(final int i){
    return i+1;
}

如上可以。说明final类型的数据可以读取但是不可以修改。

final方法

final方法使用有两个原因。
第一个原因:把方法锁定,防止任何继承类修改它的含义。想要确保在继承中使方法行为保持不变,并且不会覆盖。
第二个原因:在java早期开发过程中,如果将一个方法指明为final,就是同意编译器将针对该方法的所有调用转为内嵌调用。当编译器发现一个final方法调用命令的时候,会根据自己的谨慎判断,跳过插入程序代码这种正常方式而执行方法调用机制。并且以方法体中的实际代码的副本来替代方法的调用。这将消除方法调用的开销。当然,如果一个方法很大,你的程序代码就会膨胀,因而看不到内嵌带来的任何性能提高,因为,所带来的性能提高会因为花费于方法内的时间量而被缩减,在最近的java版本中,虚拟机可以探测到这些情况,并优化去掉这些效率反而降低的额外的内嵌调用,因此不再需要用final来进行优化,这种方法正在逐渐的受阻,只有在想要明确禁止覆盖的时候,才将方法设置为final。

final和private关键字

类中的所有private方法都隐式的指定为final,由于无法取用private方法,就无法覆盖它。可以对private方法增加final修饰词,但是没有任何意义。

final类

当将某个类的整体定义为final的时候,就表明了你不打算继承该类,而且也不允许别人这样做,对于该类永远不需要做任何变动,出于安全考虑,你不希望有子类。
final类的域可以根据个人意愿选择为是或不是final。不论类是否被定义为final。相同的规则都适用于定义为final的域。
由于final类禁止继承,所以final类中的所有方法都隐式指定为是fianl的。因为无法覆盖它。在final类中给方法添加final关键字,没什么意义。

作者:经典鸡翅
来源链接:https://www.cnblogs.com/jichi/p/12142697.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/42524.html

分享给朋友:

“重新精读《Java 编程思想》系列之final关键字” 的相关文章

Java编程思想 学习笔记5

五、初始化与清理   1.用构造器确保初始化      在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化。创建对象时,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造器,从而保证了初始化的进行。构造器的...

Java编程思想【温故知新】

第一章:对象导论 1. 抽象过程(类与对象的关系)   类是一类对象的共同行为(成员函数)与状态(成员变量),对象是具体类的实例化。(Eg.人类是一个类,共同的行为:吃,状态:名字。)   【类创建者需要考虑这件事情,回头看看这个概念四个字醍醐灌顶,每次创建这...

Java编程思想学习(十五) 注解

注解Annotation又叫元数据,是JDK5中引入的一种以通用格式为程序提供配置信息的方式。使用注解Annotation可以使元数据写在程序源码中,使得代码看起来简洁,同时编译器也提供了对注解Annotation的类型检查,使得在编译期间就可以排除语法错误。 1JDK内置的3中...

java编程思想-rtti

  在java中,我们在如何识别类和对象的信息?这这是RTTI的作用,即运行时类型识别(RTTI, Run-Time Type Identification)。     RTTI是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息。多态(polymor...

Java编程思想(六、访问权限控制)

  访问控制(或隐藏具体实现)与“最初的实现并不恰当”有关。便于未来重构代码,而不必对业务层做过多的改变。因此,Java提供了访问控制修饰词,以供类库开发人员向客户端程序员指明哪些是可用的,哪些是不可用的。   访问控制的等级,从最大权限到最小权限依次为:public、prote...

Java EE、java SE、Java ME、《java编程思想》

《java编程思想》是讲Java语言本身的,它的语法和算法等 Java EE与java SE是Java的一种开发环境,说白点就是一种软件,你的Java代码运行的地方。学习Java EE与java SE就是学习怎么使用这种软件的,就像学Photoshop一样。 Jav...

Java编程思想读书笔记

Java编程思想读书笔记

第一章对象导论... 1 第二章一切都是对象... 4 第三章操作符... 10 第四章流程控制... 12 第五章初始化与清理... 14 第六章访问权限控制... 15 第七章复用... 23 第八章多态... 24...

java编程思想chapter1

  刚才登陆的时候发现自己已经三个月的园龄了,但是什么也没有写过,在单位的一段时间,还整天来园里面来看一下,在外边外勤以来,还没有登陆过,突然之间想写一下东西,还是在这里来写吧,毕竟,这里是程序员的网上家园。   这个项目以来,发现要用java来写,以前在上学的时候曾经看过一段j...

《 Java 编程思想》CH05 初始化与清理

《 Java 编程思想》CH05 初始化与清理 用构造器确保初始化 在 Java 中,通过提供构造器,类的设计者可确保每个对象都会得到初始化。Java 会保证初始化的进行。构造器采用与类相同的名称。 由于构造器的名称必须与类名完全相同,所以“每个方法首字母小...

java编程思想读书笔记(五)

    花了十天看完了《java编程思想》,我似乎能够体会到当时c++程序员看到java时那种兴奋的感觉了,相比c++而言这确实是一种比较现代的语言——当然这不是说c++不好,C++还是我心中最强大的语言。   虽然十天的时间基本不可能对java 有一个什么比...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。