可能使用到final的情况有3种:数据、方法和类。

一、final数据

对于基本类型,final使数值恒定不变;而对于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对象,就无法把它改为指向另一个对象。然而,对象本身却是可以被修改的。

class Value{

int i;

public Value(int i){this.i=i;}

}

public class FinalData{

private final int valueOne=1;

private int valueTwo=2;

private final Value v1=new Value(11);

private Value v2=new Value(22);

public static void main(String[] args){

//! valueOne=3; 错误,静态不能更改

valueTwo=3; //可以更改

//! v1=new Value(33); 不可更改引用

v1.i+=1; //可以更改内容

v2=new Value(33); //非final,可以更改引用

}

}

注:带有恒定初始值(即,编译器常量)的final static 基本类型全用大写字母命名,并且字与字之间用下划线隔开。

public static final int VALUE_ONE=3;

必须在域的定义处或者每个构造器中用表达式对final进行赋值,这正是final域在使用前总是被初始化的原因所在。

二、final方法

使用final方法的原因是:把方法锁住,以防任何继承类修改它的含义,这是出于设计的考虑:想要确保在继承中使方法行为保持一致,并且不会被覆盖。

类中所有的private方法都隐式地指定为是final的。由于无法取用final方法,所以也就无法覆盖它。

class WithFinals{

private final void f(){print("Hello World");}

private void g(){ print("WithFinals.g()");}

}

class OverridingPrivate extends WithFinals{

private final void f(){ print("OverridingPrivate.f()");}

private void g(){ print("OverridingPrivate.g()")}

}

class OverridingPrivate2 extends OverridingPrivate{

public final void f(){ print("OverrindingPrivate2.f()")}

public void g(){ print("OverridingPrivate2.g()")}

}

public class FinalOverriding{

public static void main(String[] args){

OverridingPrivate2 op2=new OverridingPrivate2();

op2.f();

op2.g();

//向上转型

OverridingPrivate op1=op2;

//但是你不能调用下面的方法

//! op1.f();

//! op1.g();

//向上转型

WithFinals wf=op2;

//同样不能调用下面的方法

//!wf.f();

//!wf.g();

}

}

/* OverridingPrivate2.f() OverridingPrivate2.g() */

“覆盖”只有在某方法是基类的接口的一部分时才会出现。即,必须能将一个对象向上转型为它的基本类型并调用相同的方法。如果某方法为private,它就不是基类的接口的一部分。它仅是一些隐藏于类中的程序代码,只不过是具有相同的名字。如果在导出类中以相同的名称生成一个public、protected或包访问权限方法,那么该方法并没有覆盖基类的方法,仅是生成了一个新的方法。

三、final类

当某个类的整体定义为final时,就表明了你不打算继承该类,而且也不允许别人这样做。

final class Demo{

int i=1;

final int j=2;

void f(){}

}

final类不能被继承。final类的域可以根据个人意愿选择是或者不是final,然而,由于final类禁止继承,所以final类中的所有方法都隐式指定为final的,因为无法覆盖它们。在final类中可以给个方法添加final修饰词,但这不会增添任何意义。

PS:总结自《Thinking in Java Fourth Edition》

java+中的final关键字有哪些用法_Java中的Final关键字用法汇总及简单示例相关推荐

  1. java static用法_Java中static关键字的作用和用法详细介绍

    static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static ...

  2. java future用法_Java中的多线程知识点

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

  3. java关键字有什么用_JAVA中关键字有什么用

    展开全部 Java关键e68a84e8a2ad3231313335323631343130323136353331333363356566字及其作用 一. 关键字总览: 访问控制 private pr ...

  4. java implements用法_JAVA中implements的用法

    implements使用 interface Sport { void run(); void jump(); } class Athlete implements Sport { public vo ...

  5. java中compare语句的用法,compare的用法_java中 compareTo()的程序代码及用法

    compare的用法与区别? 一.用法 v. (动词) 1.compare的基本意思是"比较,对照",主要用于比较事物的典型特征及其价值,而不在于比较相同与不同. 2.compar ...

  6. indexof java 用法_java中indexof的用法

    indexOf()的用法,具体是什么意思?? indexOf()的意思:查找一个字符串中,第一次出现指定字符串的位置. indexOf()的用法: indexOf(int,ch) 先看第一个index ...

  7. java jtable用法_Java中JTable的用法

    Swing颇受欢迎的JTable类为显示大块数据提供了一种简单的机制.JTable有很多东西是用于数据的生成和编辑,其中的很多东西还可以自定义,从而更进一步增强其功能.本文会引导你一步步地进入JTab ...

  8. java .this的用法_JAVA中this用法小结

    Java中的this随处可见,用法也多,现在整理有几点: 1. this是指当前对象自己. 当在一个类中要明确指出使用对象自己的的变量或函数时就应该加上this引用.如下面这个例子中: 1 publi ...

  9. java中substring用法_java中substring的用法

    substring 1.public String substring(int beginIndex). 返回一个新的字符串,它是此字符串的一个子字符串.该子字符串始于指定索引处的字符,一直到此字符串 ...

  10. java中finally用法_java中的finally用法总结

    清单 1 说明 finally 语句块在 try 语句块中的 return 语句之前执行.我们再来看另一个例子(清单 2). 清单 2. 清单 2 的执行结果为: 清单 2 说明了 finally 语 ...

最新文章

  1. 简单电商购物程序(续1)
  2. 10个CSS和jQuery的加载中(loading)动画效果实现
  3. 为什么说 GraphQL 可以取代 REST API?
  4. python网络爬虫文献综述怎么写_毕业论文的文献综述怎么写
  5. php 开发框架 (资料收集)
  6. 工作流实战_18_flowable 流程任务的转办
  7. c语言通讯录动态文件操作,学C三个月了,学了文件,用C语言写了个通讯录程序...
  8. Python“制作”midi音乐“两只老虎”
  9. Aspose.Words for .NET
  10. 自用_C/C++报错记录汇总
  11. 图鸭科技获数千万元A轮融资,金沙江创投领投
  12. vue routes路由
  13. vue省市区三级选择的实现
  14. 计算机vfp知识要点,计算机二级考试VFP知识点:VisualFoxPro基础
  15. Android系统版本与版本代号中英文名字
  16. jitsi各工程编译笔记(一)各工程大概
  17. qdialog 圆角_QT 使用QSS实现圆角对话框
  18. uboot 下mmc read/write命令使用和验证方法
  19. Shell编程——$[ ] 、${ }、$( )、[ ]、[[ ]]、(())的区别
  20. MATLAB2018a 64安装

热门文章

  1. php with语法,Yii框架关联查询with用法分析
  2. 工业机器人滑膜变结构控制技术_机器人智能滑模变结构控制方法的研究
  3. 【matlab】零相位延迟滤波器
  4. Halcon算子学习:get_sheet_of_light_result
  5. Django 应用分库,数据迁移成功,数据库没有生成表
  6. ThinkPHP入门
  7. React Native实例之房产搜索APP
  8. mysql max字符串数值_针对字符串值的mysql:min()和max()。
  9. createsamples.cpp中生成vec文件的实现及详细注释、图解——人脸识别的尝试系列(三)
  10. PBOC3.0中使用的国密SM2算法