`

还是TIJ里把final解释得最彻底

阅读更多
以前我是这样理解final的:

final表示最终的,它可以修饰变量,方法和类。当它修饰变量的时候,这个变量不能再被与修改(注:错误的,至少不全);当它修饰方法时,该方法不能被override(重写);当它修饰类时,该类不能再派生出子类。

回头看了TIJ, 才知道自己的理解其实很片面,或者很肤浅,下面是TIJ里对final阐述的总结:


final表示“这样东西是不允许改动的”的意思。它可以修饰数据,方法,以及类。

final数据

对primitive来说,final会将这个值定义成常量,在定义时赋值;既是static又是final的数据成员会只占据一段内存,并且不可修改。
对reference来说,final的意思则是这个reference是常量,初始化的时候,一旦将reference连接到某个对象,那么它就再也不能指别的对象了,但这个对象本身是可以修改的,Java没有提供将某个对象当作常量的方法。

final 方法
禁止派生类修改该方法!

final和private
Private方法已经隐含有final的意思,因为外部是不能访问private的,也就不存在覆写它。

final类
出于类的设计考虑,它再也不需要作修改了;或者从安全角度出发,不希望它再派生出子类。
final类的数据可以是final的,也可以不是final的,这由自己决定;对于它的方法,由于final类禁止了继承,覆写方法已经不可能,所以所有的方法都隐含地变成final的了!

下面是TIJ4里关于final的一些示例:

/*************************** "final" 修饰参数示例/***************************/

class Gizmo
{
	public void spin()	{}
}

public class FinalArguments
{
	void with(final Gizmo g)
	{
		// ! g = new Gizmo(); 
		// 非法,g 是引用常量是不能指向新的对象的
	}
	void without(Gizmo g)
	{
		g = new Gizmo(); // 没有问题
		g.spin();
	}
	
	// void f(final int i) { i++; } 
	// 只能读取primitive类型的常量,不能修改
	
	int g(final int i)	{return i + 1;	}
	
	public static void main(String[] args)
	{
		FinalArguments bf = new FinalArguments();
		bf.without(null);
		bf.with(null);
	}
} // /:~

/*************************** final成员变量的示例 ***************************/
import java.util.*;
import static net.mindview.util.Print.*;

class Value
{
	int i; // 包访问限制
	public Value(int i)	{	this.i = i;	}
}

public class FinalData
{
	private static Random rand = new Random(47);
	private String id;

	public FinalData(String id)	{	this.id = id;	}

	// 编译时常量
	private final int valueOne = 9;
	private static final int VALUE_TWO = 99;
	
	// 典型的公共访问常量
	public static final int VALUE_THREE = 39;
	
	// 非编译时常量
	private final int i4 = rand.nextInt(20);
	static final int INT_5 = rand.nextInt(20);
	
	// 对象引用常量
	private Value v1 = new Value(11);
	private final Value v2 = new Value(22);
	private static final Value VAL_3 = new Value(33);
	
	// 数组
	private final int[] a = { 1, 2, 3, 4, 5, 6 };

	//重写toString()方法
	public String toString()
	{
		return id + ": " + "i4 = " + i4 + ", INT_5 = " + INT_5;
	}
	
	public static void main(String[] args)
	{
		FinalData fd1 = new FinalData("fd1");
		// ! fd1.valueOne++; // Error: can't change value
		fd1.v2.i++; // Object isn't constant!
		fd1.v1 = new Value(9); // OK -- not final
		for (int i = 0; i < fd1.a.length; i++)
			fd1.a[i]++; // Object isn't constant!
		// ! fd1.v2 = new Value(0); // Error: Can't
		// ! fd1.VAL_3 = new Value(1); // change reference
		// ! fd1.a = new int[3];
		print(fd1);
		print("Creating new FinalData");
		FinalData fd2 = new FinalData("fd2");
		print(fd1);
		print(fd2);
	}
}/* Output:
fd1: i4 = 15, INT_5 = 18
Creating new FinalData
fd1: i4 = 15, INT_5 = 18
fd2: i4 = 13, INT_5 = 18
*///:~

/*************************** final,private的示例 ***************************/

class WithFinals
{
	// 虽然加上了final,但效果和只有private一样,private+final是无意义的 
	private final void f()
	{
		print("WithFinals.f()");
	}
	// private在其它类中本身就看不见,也就无法重写,相当于隐含了final
	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("OverridingPrivate2.f()");
	}
	public void g()
	{
		print("OverridingPrivate2.g()");
	}
}

public class FinalOverridingIllusion
{
	public static void main(String[] args)
	{
		OverridingPrivate2 op2 = new OverridingPrivate2();
		op2.f();
		op2.g();
		// You can upcast:
		OverridingPrivate op = op2;
		// But you can't call the methods:
		// ! op.f();
		// ! op.g();
		// Same here:
		WithFinals wf = op2;
		// ! wf.f();
		// ! wf.g();
	}
}
/* Output:
OverridingPrivate2.f()
OverridingPrivate2.g()
*///:~

分享到:
评论

相关推荐

    TIJ4-solutions

    《TIJ4-solutions》是针对《Thinking in Java》第四版(简称TIJ4)的一份解决方案集。这本书由Bruce Eckel撰写,是Java编程领域里极具影响力的教材之一,深受程序员喜爱。本压缩包中的"TIJ4-solutions.pdf"很可能是...

    TIJ阅读笔记.doc

    【TIJ阅读笔记】 在Java编程中,内存管理是一个关键的概念。Java的内存分为两种主要区域:堆(Heap)和栈(Stack)。堆是用于动态创建对象的主要内存池,包括数组和其他复杂对象,由垃圾回收机制自动管理。而栈则...

    TIJ4-code-master.zip及相关jar包、练习题答案

    这个压缩包"TIJ4-code-master.zip"包含了该书的源代码、相关jar包以及练习题的答案,为学习者提供了全面的实践资源。 1. **Thinking in Java核心知识点** - **基础语法**:书中深入浅出地讲解了Java的基础语法,...

    TIJ4 Code

    Thinking in java 4 Source Code

    TIJ4 Initialization Cleanup

    TIJ4 Initialization Cleanup

    The Thinking in Java Annotated Solution Guide(TIJ4-solutions)

    在深入讨论本书内容之前,首先需要明确的是,《Thinking in Java Annotated Solution Guide (TIJ4-solutions)》的版权属于MindView, Inc.,并且它不是免费资源。这意味着,未经版权所有者的明确许可,任何人不得将其...

    TIJ4-code.rar_TI

    《深入理解Java编程思想》是Java开发者们常常参考的一本经典书籍,其源代码"TIJ4-code.rar_TI"提供了一种深入学习Java编程的宝贵资源。这本书籍着重于理论与实践相结合,通过丰富的示例代码帮助读者掌握Java的核心...

    TIJ4-code:Java源代码中的Tink

    用Java思考,第4版:下载,安装和测试代码 请注意,本书涵盖了Java 5/6。 最新一本书涵盖了Java 8。... 请注意,最可靠的方法是安装到默认目录。 将JDK的bin目录添加到路径中。 在计算机环境中设置

    TIJ4Reusing Classes

    thinking in java 4 Reusing Classes 读书笔记

    TIJ4-code_ThinkinginJava_conversationemk_

    "conversationemk"可能是指作者在书中提到的一个特定的示例或实验,而"TIJ4-code"则显然是这个压缩包中包含的所有示例代码的集合。 这个压缩包中的代码旨在帮助读者深入理解Java语言的各种特性和概念。以下是根据...

    tij.rar_VB控制_界面编程

    标题中的“tij.rar_VB控制_界面编程”暗示了这个压缩包可能包含与Visual Basic(VB)编程相关的资源,特别是关于如何在VB环境中进行界面设计和控件自适应调整的内容。描述中提到的“VB自动地调整VB控制的大小和一种...

    tij4-code:java编程思想第四版-GIT

    《Java编程思想》第四版是 Bruce Eckel 的经典著作,这本书深入浅出地介绍了Java语言,深受广大开发者喜爱。"tij4-code:java编程思想第...无论你是初学者还是有一定经验的开发者,都可以从中获得宝贵的知识和实践经验。

    Thinking in java\TIJ4-solutions-demo

    ### Thinking in Java ...本书适合所有希望深入了解Java编程的程序员,无论是初学者还是有经验的开发者都能从中获益匪浅。通过阅读本书,你可以系统地学习Java的核心概念和技术,为进一步的学习和发展打下坚实的基础。

    Thinking In Java 第四版-源代码TIJ4-code

    《Thinking in Java》是Bruce Eckel的经典编程教材,第四版更是深受程序员...无论是初学者还是经验丰富的开发者,都能从中受益匪浅。通过逐步分析和运行这些代码,你可以逐步提升自己的编程技能,形成良好的编程思维。

    tij4:java中的思考第四版

    《Thinking in Java》是Bruce Eckel的经典之作,第四版更是对Java编程的深入解析和思考。这本书涵盖了Java语言的基础到高级特性,旨在帮助读者全面理解Java编程思想,从而提升编程能力。现在,我们来深入探讨一下...

    TIJ4-code_idea:Java 中的思考第 4 版练习题

    "TIJ4-code_idea"项目是这本书的代码示例和练习集,使用IntelliJ IDEA开发环境进行编译和运行。下面我们将详细探讨这个项目中可能涉及的Java知识点。 1. **基础语法**:Java的基础语法包括变量、数据类型、运算符、...

    TIJ4 Access Control 2015-11-19

    thinking in java 4 access control

    thinking_in_java:将TIJ4源代码重新排列到单独的项目中-java project source code

    将TIJ4源代码重新安排到可以在IntelliJ中执行的单独项目中 第5章初始化 不 Prj 描述 1个 2个 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18岁 19 20 21岁 22 23 24 25 26 27 28岁 29 30 31 32 33 34 35 36 ...

    The_Thinking_in_Java_Annotated_Solution_Guide(TIJ4-solutions)

    6. 书籍出版时间:提到"The Thinking in Java Annotated Solution Guide"第四版(TIJ4)出版于2006年,而解决方案指南则在2007年发布。这说明书籍内容是相对现代的,可能包含了Java的一些更新和改进,以及与之相关的...

Global site tag (gtag.js) - Google Analytics