可能使用final的三种情况:数据、方法、类。

1.final数据

final 常量必须是基本类型数据,且在定义时须赋值;

一个既是static又是final的域只占据一段不能改变的存储空间,只有一份;(使用全大写字母命名)

当用于对象引用,final使引用只能指向一个对象(实例化一次)。对象本身可以修改。

package chapter7;

import java.util.Random;

/**
* final数据
*/
class Value {
int i; public Value(int i) {
this.i = i;
}
} public class FinalData {
private static Random rand = new Random();
private String id; public FinalData(String id) {
this.id = id;
} private final int valueOne = ;
private static final int VALUE_TWO = ;
public static final int VALUE_THREE = ; private final int i4 = rand.nextInt();
static final int INT_5 = rand.nextInt(); private Value v1 = new Value();
private final Value v2 = new Value();
private static final Value VAL_3 = new Value(); private final int[] a = { , , , , , }; public String toString() {
return id + ": " + "i4 = " + i4 + ",INT_5 = " + INT_5;
} public static void main(String[] args) {
FinalData fd1 = new FinalData("fd1");
// fd1.valueOne++;
fd1.v2.i++;
fd1.v1 = new Value();
for (int i = ; i < fd1.a.length; i++)
fd1.a[i]++;
// !fd1.v2=new Value(0);
// !fd1.VAL_3=new Value(1);
// !fd1.a=new int[3];
System.out.println(fd1);
System.out.println("Creating new FinalData");
FinalData fd2 = new FinalData("fd2");
System.out.println(fd2);
}
}

【运行结果】:
fd1: i4 = 15,INT_5 = 18
Creating new FinalData
fd2: i4 = 13,INT_5 = 18

final与static final的区别是:final在一个对象类唯一,static final在多个对象中都唯一。

空白final

需在构造函数中对final赋值

package chapter7;

import java.awt.PageAttributes;

/**
* 空白final
*/
class Poppet {
private int i; Poppet(int ii) {
i = ii;
}
} public class BlankFinal {
private final int i = ;
private final int j;
private final Poppet p; public BlankFinal() {
j = ;
p = new Poppet();
} public BlankFinal(int x) {
j = x;
p = new Poppet(x);
} public static void main(String[] args) {
new BlankFinal();
new BlankFinal();
}
}

final方法

要明确禁止覆盖时,才将方法设置为final;

若基类中方法为private时,该方法不是接口的一部分,仅是隐藏于类中的代码。

下面的例子证明,基类中方法为private,导出类中以相同名称生成public等方法,并没有覆盖基类中的方法。

package chapter7;

class WithFinal {
private final void f() {
System.out.println("WithFinal f()");
} private final void g() {
System.out.println("WithFinal g()");
}
} class OverridingPrivate extends WithFinal {
private final void f() {
System.out.println("OverridingPrivate f()");
} private final void g() {
System.out.println("OverridingPrivate g()");
}
} class OverridingPrivate2 extends OverridingPrivate {
public final void f() {
System.out.println("OverridingPrivate2 f()");
} public final void g() {
System.out.println("OverridingPrivate2 g()");
}
} public class FinalOverridIllusion {
public static void main(String[] args) {
OverridingPrivate2 op2 = new OverridingPrivate2();
op2.f();
op2.g();
OverridingPrivate op = op2;
// !op.f();
// !o2.g();
WithFinal wf = op2;
// !wf.f();
// !wf.g();
}
}

【运行结果】:
OverridingPrivate2 f()
OverridingPrivate2 g()

final类

不能继承该类

(五)《Java编程思想》——final关键字的更多相关文章

  1. 《Java编程思想》读书笔记(五)

    前言:本文是<Java编程思想>读书笔记系列的最后一章,本章的内容很多,需要细读慢慢去理解,文中的示例最好在自己电脑上多运行几次,相关示例完整代码放在码云上了,码云地址:https://g ...

  2. 《java编程思想》读书笔记(一)开篇&第五章(1)

    2017 ---新篇章  今天终于找到阅读<java编程思想>这本书方法了,表示打开了一个新世界. 第一章:对象导论 内容不多但也有20页,主要是对整本书的一个概括.因为已经有过完整JAV ...

  3. JAVA编程思想读书笔记(五)--多线程

    接上篇JAVA编程思想读书笔记(四)--对象的克隆 No1: daemon Thread(守护线程) 参考http://blog.csdn.net/pony_maggie/article/detail ...

  4. 关于 java编程思想第五版 《On Java 8》

    On Java 8中文版 英雄召集令 这是该项目的GITHUB地址:https://github.com/LingCoder/OnJava8 广招天下英雄,为开源奉献!让我们一起来完成这本书的翻译吧! ...

  5. Java编程思想 (1~10)

    [注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第一章 对象导论 1.万物皆对象2.程序就是对象的集合3.每个对象都是由其它对象所构成 ...

  6. Java编程思想(前十章)

    Java编程思想 有C++编程基础的条件下, 前10章可以快速过一下,都是基本语法,不需要花太多时间. 着重中后段的一些章节,类型信息.泛型.容器.IO.并发等. 中文翻译版 阅读地址 对于一个架构师 ...

  7. 《Java编程思想》阅读笔记二

    Java编程思想 这是一个通过对<Java编程思想>(Think in java)进行阅读同时对java内容查漏补缺的系列.一些基础的知识不会被罗列出来,这里只会列出一些程序员经常会忽略或 ...

  8. JAVA编程思想——分析阅读

    需要源码.JDK1.6 .编码风格参考阿里java规约 7/12开始 有点意识到自己喜欢理论大而泛的模糊知识的学习,而不喜欢实践和细节的打磨,是因为粗心浮躁导致的么? cron表达式使用 设计能力.领 ...

  9. 《Java编程思想》读书笔记(二)

    三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第一章到第十章的内容,这一次记录的是第 ...

  10. #Java编程思想笔记(一)——static

    Java编程思想笔记(一)--static 看<Java编程思想>已经有一段时间了,一直以来都把笔记做在印象笔记上,今天开始写博客来记录. 第一篇笔记来写static关键字. static ...

随机推荐

  1. foreach遍历原理(一)

    前言 要使用foreach的遍历的类首先要满足的条件 1. 类要实现公共方法 public IEnumerator GetEnumerator(){},还可以继承IEnumerable接口来实现这个方 ...

  2. 自己动手开发编译器(四)利用DFA转换表建立扫描器

    上回我们介绍了两种有穷自动机模型——确定性有穷自动机DFA和非确定性有穷自动机,以及从正则表达式经过NFA最终转化为DFA的算法.有些同学表示还是难以理解NFA到底怎么转化为DFA.所以本篇开头时我想 ...

  3. 在网上看到一个关于APP的测试

  4. Reaver v1.4 用法整理 含高级参数说明 pin必备资料

    闲话少叙 使用方法: airmon-ng start wlan0 //启动mon0监控 reaver -i mon0 -b MAC -a -S -vv //普通用法 如果,90.9%进程后死机或停机, ...

  5. c#使用UIA进行模拟点击操作

    之前,我写过一篇c#使用spy进行模拟操作的文章,有朋友在留言中提到了UIA进行操作,今天也使用UIA重新实现一次对vnc窗体的控制测试. 实现目标 在server框内填入192.168.2.200 ...

  6. Ubuntu12.04 下搭建Java开发环境

    1:下载 jdk-7u40-linux-i586.tar.gz. 2:解压安装. (1)创建jvm目录:sudo mkdir -p /usr/lib/jvm (2)sudo tar zxvf ./ j ...

  7. Cracking the coding interview--Q1.2

    原文 Implement a function void reverse(char* str) in C or C++ which reverses a null-terminated string. ...

  8. 如何获取drawable目录下的图片绝对路径

    Uri uri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + r.getResourcePackage ...

  9. Android视图框架

    Android视图框架 Android的UI系统是android应用系统框架最核心,最基础的内容! 1. Android视图系统.层次关系 Android应用设计和Web应用设计类似,也分前端和后端设 ...

  10. android调用系统自带的的浏览器搜索关键字

    //调用系统的浏览器搜索详情 public void jumpBrowser(String value) { /* 取得网页搜寻的intent */ Intent search = new Inten ...