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 ...
随机推荐
- jq .attr()和.prop()方法的区别
今天在nodejs交流群里面遇到别人在里面说面试的时候遇到了这个问题,没回答出来,面试官讲的他也不明白,这个问题看着很简单,但是往深的解释就很难了. 对于HTML元素本身就带有的固有属性,在处理时,使 ...
- jQuery可放大预览的图片滑块
在线演示 本地下载
- 20145240《Java程序设计》第一周学习总结
20145240 <Java程序设计>第一周学习总结 教材学习内容总结 第一周学习Java首先从最基本的下载.配置环境.了解基本人机命令行方式等基础知识,以及编写简单的"Hell ...
- Android电容屏(二):驱动调试分析【转】
本文转载自:http://blog.csdn.net/xubin341719/article/details/7833383 以goodix的gt8105为例 一.总体架构 硬件部分:先看一个总体的图 ...
- Go tail库
HP团队出的tail库,常用于日志收集 示例代码: package main import ( "github.com/hpcloud/tail" "fmt" ...
- juniper ssg 常用命令
netscreen juniper ssg操作命令 2013年4月10日 命令行下取得配置信息 get config 命令行下取得相应时间设置 get clock set vrout ...
- linux基础(9)-获取时间
获取今天日期 date +%Y-%m-%d date +%y-%m-%d date +%F 获取昨天日期 date -d yesterday +%F date -d -1day +%F ...
- 循环插入一条数据的sql写法
DECLARE @i INTSET @i = 1WHILE @i > 0 BEGIN DECLARE @TransportFormMstID BIGINT; DECLARE @TradeOrde ...
- JavaWeb -- Servlet+JSP+JavaBean(MVC)模式
Servlet+JSP+JavaBean(MVC)模式适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据. Servlet+JSP ...
- Left Join ,On Where
SQL语句如下: SELECT * FROM 表1 LEFT JOIN 表2 ON 表1.id = 表2.id AND 表2.Name != 'ff' WHERE 表1.NAME != 'aa' 步骤 ...