时间:2021-05-20
在Java中通过final关键字来声明对象具有不变性(immutable),这里的对象包括变量,方法,类,与C++中的const关键字效果类似。
immutable指对象在创建之后,状态无法被改变
可以从三个角度考虑使用final关键字:
final 变量
定义final Object a,则a只能被初始化一次,一旦初始化,a的数据无法修改,若a为引用类型,则不能重新绑定其他对象。
未被初始化的final变量被称为blank final,若为成员变量,则必须被初始化或在构造器中赋值。
例子:
final 方法
定义final method,则该方法无法被重载,方法设计者不希望由于对方法的重载导致其他相关功能出现异常。
例子:
需要注意的是,final方法的定义不一定能够产生inline的效果,因为方法是否inline取决于JVM的策略,而非final关键字,通过final的设计提高方法效率是不准确的。
final 类
final class X定义的类X无法被继承。
在Java中,String类被设计成final,其定义如下
复制代码 代码如下:
public class final String extends Object implements Serializable, Comparable<String>, CharSequence
内部类与final
在一个方法内定义匿名内部类时,内部类只能访问方法内的final类型变量,使得Java编译器能够提前捕获变量的值,并在内部类保存一份副本,当方法销毁时,内部类的内存空间依然完整。
例子:
PS:内部匿名类无法访问外面的非 final 的变量的问题
这个听起来有点拗口,其实我更多的是想说 Java 内部类的一些特性。
之所以会想起这个题目只要是最近在阅读 JDK 源码中关于 HTTP keepalive 的代码时,其中一个源文件 sun.net.Address.getByName(h2); result[0] = a1.equals(a2); } catch (UnknownHostException e) { } catch (SecurityException e) { } return null; }});return result[0];
Java 的匿名内部类无法访问对应的函数的非 final 变量。要想访问外部的 local variable, 这个variable 又必须要先定义成 fianl, 但是一定义成 final 就不能在匿名内部类中修改这个变量的值,所以要想匿名内部类返回一些有用的值时不是那么的容易。这段代码使用了一个非常巧妙的方法,这里使用数组的方式绕过这个限制,虽然我们无法修改 result 这个变量的引用,但是我们可以修改 result 指向的那个数组的内容。
只是想记录一下内部匿名类修改外部变量的一个小技巧。不过既然已经到了这里,不妨继续的看看内部类都有哪些特性或者限制吧。
在继续本文前,我觉得非常有必要的明确下本文中涉及的一些 Java 术语,这些术语不太好翻译成中文,所以我们还是用英文来描述。
// This is classpublic class JavaTerm { // field or member variable private int field; // constructor public JavaTerm() { } // method public void method() { // local variable int localVariable = 0; // local class class LocalClass { public LocalClass() { } } // anonymous class new Runnable() { public void run() { } }; }}我们今天更多的将关注于 local class 和 anonymous class,它们都属于 inner class。
Java 允许我们在一个 class 里面再定义一个 class, 称为嵌套类(nested class), nested class 又可以分为两类,一类是 static nested class, 另外一个是 non-static nested class, 又称为 inner class。inner class 又可以分为 local class 和 anonymous class。
anonymous class 的一些限制
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
javafinal关键字详解:前言:Java中的final关键字非常重要,它可以应用于类、方法以及变量。这篇文章中我将带你看看什么是final关键字?将变量,方
Javathis关键字的使用方法详解构造方法中的this关键字构造方法是一个类的对象在通过new关键字创建时自动调用的,在程序中不能向调用其他方法一样通过方法名
final经常和static一起使用来声明常量,你也会看到final是如何改善应用性能的。final关键字的含义?final在Java中是一个保留的关键字,可以
java中的final关键字详解final的作用随着所修饰的类型而不同1、final修饰类中的属性或者变量无论属性是基本类型还是引用类型,final所起的作用都
Java中finalize()详解在程序设计中,我们有时可能希望某些数据是不能够改变的,这个时候final就有用武之地了。final是Java的关键字,它所表示