java中final用法
1.修饰基础数据成员
这是final的主要用途,其含义相当于C/C++的const,即该成员被修饰成常量,不可修改。
2.修饰类或者对象的引用的final
在java中我们无法让对象被修饰为final,只能修饰对象的引用。这意味着即使你写了public final A a = new A();事实上a指向的对象的数据依然可以被修改,不能修改的是a的引用值,即你不能再对a进行重赋值。同样的情况出现在数据组,比如 public final int[] a={1,2,3,4,5},事实上a的数值是可修改的,即可以a[0] = 6;。
3.修饰方法的final
修饰方法的final与C/C++中修饰成员对象的const大不相同。首先,修饰方法的final含义不是“不可修改”,而是指该方法不可以被继承成员重新定义。(这里的不能被重新定义,并不是指子类一定不能定义同名方法,如果父类的方法是私有类型,子类是允许定义该方法的,这里指的不能重新定义是指不能通过改写方法来使得方法重写的多态性得以实现,如不希望A a = new B(),a.f()这样的重写方法出现。)
public class A {
// final方法f
public final void f() {
System.out.println("类A中的final方法f被调用了");
}
}
public class B extends A {
// 编译错误!父类的f方法是final类型,不可重写!
//! public void f() {
//! System.out.println("类B中的方法f被调用了");
//! }
}
此外,当一个方法被修饰为final方法时,意味着编译器可能将该方法用内联方式载入。所谓内联方式是指编译器不用像平常调用函数那样的方式来调用,而是直接将方法内的代码通过一定的修改后copy到源代码中(将方法主体直接插入到调用处,而不是调用方法),这样可以更快的执行。
4.修饰类的final
当一个类被修饰为final时,它含义很明确,不允许该类被继承。
public final class A {
}
// 编译错误!A是final类型,不可被继承!
//!public class B extends A{
//!}
5.参数final
对对象参数做final修饰,对象变量传递的是其引用,为防止调用过程中无意的更改而修饰。
6.static加final一块用
这两者放到一块可以简单理解为“全局常量”,对于变量,表示一旦给值就不能修改,可通过类名访问。对于方法,表示不可覆盖且可通过类名直接访问。
7.java允许空白final
所谓空白final是指被声明为final但又未给定初值的域。无论什么情况,编译器都确保空白final在使用前必须初始化。但是空白final在关键字final的使用上提供了更大的灵活性,为此,一个类中的final域就可以做到根据对象而有所不同,却又保持其恒定不变的特性。如:
class Poppet{
private int i;
Poppet (int ii){
i = ii;
}
pulic class BlankFinal{
private final int i = 0;//初始化final
private final int j; //空白final
private final Poppet p;//空白final引用
//空白final必须在构造器中初始化
public BlankFinal(){
j = 1;//初始化空白final
p = new Poppet(1);//初始化空白final引用
}
public BlankFinal(int x){
j = x;//初始化空白final
p = new Poppet(x);//初始化空白final引用
}
public static void main(String[] args){
new BlankFinal();
new BlankFinal(47);
}
}
必须在域的定义处或者每个构造器中用表达式对final进行填充,这正是final域在使用前总是被初始化的原因所在。
8.final和private关键字
类中所有private方法都隐式的指定为final。无法取用private,故无法覆盖它。
java中final用法的更多相关文章
- 转 Java中final、finally、finalize的区别与用法
Java中final.finally.finalize的区别与用法 1.简单区别:final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承.finally是异常处理语句结构 ...
- Java中final修饰符深入研究
一.开篇 本博客来自:http://www.cnblogs.com/yuananyun/ final修饰符是Java中比较简单常用的修饰符,同时也是一个被"误解"较多的修饰符.对很 ...
- 【Java面试题系列】:Java中final finally finalize的区别
本篇为[Java面试题系列]第三篇,文中如有错误,欢迎指正. 第一篇链接:[Java面试题系列]:Java基础知识常见面试题汇总 第一篇 第二篇链接:[Java面试题系列]:Java基础知识常见面试题 ...
- Java中final的作用
Java中Final可以被用于变量,方法,类.具体来说: 1, Final 变量 修饰主类型时,制定变量为常数,不希望被改变 修饰类类型时,表示变量的句柄不变,不能被指定指向新的变量 修饰参数时,参数 ...
- JAVA中ArrayList用法
JAVA中ArrayList用法 2011-07-20 15:02:03| 分类: 计算机专业 | 标签:java arraylist用法 |举报|字号 订阅 Java学习过程中做题时 ...
- 深刻理解Java中final的作用(一):从final的作用剖析String被设计成不可变类的深层原因
声明:本博客为原创博客,未经同意,不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(原文链接为http://blog.csdn.net/bettarwang/article/det ...
- java中final的意义
1.如果一个数据既是static又是final,那么它会拥有一块无法改变的存储空间. 2.final data: 当final用于基本数据类型时,final让其值(value)保持不变,但是当用于ob ...
- this在java中的用法
this在java中的用法 1.使用this关键字引用成员变量 作用:解决成员变量与参数或局部变量命名冲突的问题 public class Dog { String name; public Dog( ...
- Java中final,finally和finalize区别
Day11_SHJavaTraing_4-18-2017 Java中final,finally和finalize区别 1.final—修饰符(关键字) ①final修饰类,表示该类不可被继承 ②fin ...
随机推荐
- CSS实现三角形图标的原理!!!!今天总算弄懂了。
网页中经常有一种三角形的图标,鼠标点一下会弹出一个下拉菜单之类的(之前淘宝也有,不过现在改版好像没有了) 之前以为是个png图标背景,后来在bootstrap中看到有一个图标样式叫做caret的用来实 ...
- 基于SSM的单点登陆03
TbUser.java和TbUserExample.java,TbUserMapper.java,TbUserMapper.xml由mybatis框架生成. generatorConfig.xml & ...
- LVS/DR 配置
LVS/DR 配置 实验环境 三台主机:Linux Centos 6.4 32位 调度器Director:192.168.1.160(公网IP).192.168.1.100(VIP) HTTP真实服务 ...
- 主攻ASP.NET.4.5.1 MVC5.0之重生:空地搭建一个包含 Ninject框架 项目
1.创建一个空白解决方案 2.添加一个类库 名称为XXX.Domain 3.添加一个ASP.MVC 名称为XXX.WebUI 4.选着空模版,勾选MVC核心引用 5.添加单元测试项目XXX.UntiT ...
- OLTP和OLAP浅析
数据库设计的一个根基就是要弄清楚数据库的类型. 当今的数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing在线事务处理,联机事务处理).联 ...
- R的基础学习之数据结构
来源:http://blog.qiubio.com:8080/archives/3753/4 1.atomic vector :一维的,放置同一类型数据的数据类型 1.1创建:由c()函数 ,seq( ...
- 九、搭建备份服务器 使用rsync服务
简介 Rsync是开源快速.多功能,可以实现全量和增量的本地或者远程数据同步备份的优秀工具.增量备份效率更高,可以同步内容也可以同步属性 [root@backup-41 ~]# rpm -qa rsy ...
- 《Inode与Block重要知识总结核心讲解》【转】
本文转载自:https://blog.csdn.net/BlackEnn/article/details/50787092 1.查看/dev/sda1下磁盘分区的block大小: 2.查看单个inod ...
- ubuntu关闭631(cups)端口
在ubuntu17.04环境下使用nmap扫描自己机器,发现631端口处于开启状态,将其输入到浏览器,可以看出是网络打印机的服务: 这个端口开着总是那么的刺眼,(5.12全球爆发的勒索病毒让人不寒而栗 ...
- Go Interface概念
简单地说 Interface是一组Method的组合,可以通过Interface来定义对象的一组行为.如果某个对象实现了某个接口的所有方法,就表示它实现了该借口,无需显式地在该类型上添加接口说明.In ...