文档章节

Java的final方法与Java的内联函数

ND小龙
 ND小龙
发布于 2017/09/03 23:29
字数 689
阅读 53
收藏 1

final方法

《java编程思想》中讲到final方法时提到,使用final方法原因有两个, 
一、锁定方法。防止任何继承类修改、覆盖 
二、效率。在java早期实现中,如果将一个方法指明为final,就是同意编译器将针对该方法的调用都转化为内嵌调用。

如果是内嵌调用,虚拟机不再执行正常的方法调用(参数压栈,跳转到方法处执行,再调回,处理栈参数,处理返回值),而是直接将方法展开,以方法体重的实际代码替代原来的方法调用。这样减少了方法调用的开销。

 

内联函数

对函数(方法)进行某种处理,在程序运行的时候将函数(方法)展开,转换为代码。要问这样做的意义就不得不提到方法(Java中没有函数,以下用方法表示)的运行原理。

 

内联函数特点: 
(1)提升效率。如上说明。 
(2)占更多内存空间。编译器直接将内联函数扩展开,调用多复制品就多,因此更占用内存。 
(3)java中不需额外关注,jvm会自动进行优化。

 

举例

int max (int a, int b){
    if (a > b)
        return a;
    else
        return b;
}

 

void main() {
        .....
    a = max (x, y); // 内联,等价于 "a = (x > y ? x : y);" 直接扩展开了,不再调用方法
        .....
}

 

调用方法的原理

调用某个方法实际上将程序执行顺序转移到该方法所存放在内存中某个地址,将方法的程序内容执行完后,再返回到转去执行该方法前的地方。这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要恢复现场,并按原来保存地址继续执行。也就是通常说的压栈和出栈。因此,函数调用要有一定的时间和空间方面的开销。那么对于那些函数体代码不是很大,又频繁调用的函数来说,这个时间和空间的消耗会很大。 
因此对于这种内容较短却又反复使用的方法我们可以通过使用内联函数来提升运行效率。

 

最后

final关键字只是告诉编译器,在编译的时候考虑性能的提升,可以将final函数视为内联函数。但最后编译器会怎么处理,编译器会分析将final函数处理为内联和不处理为内联的性能比较了。(和垃圾处理机制类似,程序员只有建议权而没有决定权)

本文转载自:http://blog.csdn.net/rflyee/article/details/51067301

共有 人打赏支持
ND小龙
粉丝 10
博文 45
码字总数 2295
作品 0
福州
私信 提问
05-《深度拆解JVM》之JVM是如何执行方法调用的?(下)

一、问题引入 我们知道,设计模式大量使用了虚方法来实现多态。但是虚方法的性能效率并不高,所以作者就想在此基础上写篇文章,评估每一种设计模式因为虚方法调用而造成的性能开销,并且在文...

飞鱼说编程
2018/09/25
0
0
Java finalize方法

《JAVA编程思想》: java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。 (1).对象不一定会被回收。 (2).垃圾回收不是析构函数。 (3).垃圾回收只与内存有关。 (4)....

清风伴月
2017/10/22
0
0
探索 Kotlin 的隐性成本(Part 1)

在 2016 年,Jake Wharton 给出了一系列有趣的谈话,这些谈话是关于 Java 的隐形成本 。在同一时期,他开始提倡使用 Kotlin 语言来进行安卓开发,但是这里他却几乎没有提到使用这种新语言的隐...

oschina
2017/07/31
3.4K
14
java程序员基础进阶篇,万丈高楼平地起

一.final,finally,finalize 三者区别 Final是一个修饰符: 当final修饰一个变量的时候,变量变成一个常量,它不能被二次赋值 当final修饰的变量为静态变量(即由static修饰)时,必须在声明这...

启示录是真的
2018/05/26
0
0
03《Java核心技术》之谈谈final、finally、 finalize有什么不同?

一、提出问题 Java 语言有很多看起来很相似,但是用途却完全不同的语言要素,这些内容往往容易成为面试官考察你知识掌握程度的切入点。 今天,我要问你的是一个经典的 Java 基础题目,谈谈 ...

飞鱼说编程
2018/09/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周五乱弹 —— 姑娘馋的口水都留下来了。

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @且无需多言 :分享Fall Out Boy的单曲《Disloyal Order Of Water Buffaloes》 《Disloyal Order Of Water Buffaloes》- Fall Out Boy 手机党...

小小编辑
今天
108
7
vue 对对象的属性进行修改时,不能渲染页面 vue.$set()

我在vue里的方法里给一个对象添加某个属性时,我console.log出来的是已经更改的object ,但是页面始终没有变化 原因如下: **受现代 JavaScript 的限制 (而且 Object.observe 也已经被废弃),...

Js_Mei
今天
2
0
开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
12
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
9
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部