在川航网站购票后怎么做,专业的网站制作,免备案免费虚拟主机,wordpress for sae图床在java的关键字中#xff0c;static和final是两个我们必须掌握的关键字。不同于其他关键字#xff0c;他们都有多种用法#xff0c;而且在一定环境下使用#xff0c;可以提高程序的运行性能#xff0c;优化程序的结构。下面我们来了解一下final关键字及其用法。 final关键… 在java的关键字中static和final是两个我们必须掌握的关键字。不同于其他关键字他们都有多种用法而且在一定环境下使用可以提高程序的运行性能优化程序的结构。下面我们来了解一下final关键字及其用法。 final关键字 在java中final的含义在不同的场景下有细微的差别但总体上来说它指的是“这是不可变的”。下面我们来讲final的四种主要用法。 1.修饰数据 在编写程序时我们经常需要说明一个数据是不可变的我们成为常量。在java中用final关键字修饰的变量只能进行一次赋值操作并且在生存期内不可以改变它的值。更重要的是final会告诉编译器这个数据是不会修改的那么编译器就可能会在编译时期就对该数据进行替换甚至执行计算这样可以对我们的程序起到一点优化。不过在针对基本类型和引用类型时final关键字的效果存在细微差别。我们来看下面的例子 1 class Value {2 int v;3 public Value(int v) {4 this.v v;5 }6 }7 8 public class FinalTest {9
10 final int f1 1;
11 final int f2;
12 public FinalTest() {
13 f2 2;
14 }
15
16 public static void main(String[] args) {
17 final int value1 1;
18 // value1 4;
19 final double value2;
20 value2 2.0;
21 final Value value3 new Value(1);
22 value3.v 4;
23 }
24 } 上面的例子中我们先来看一下main方法中的几个final修饰的数据在给value1赋初始值之后我们无法再对value1的值进行修改final关键字起到了常量的作用。从value2我们可以看到final修饰的变量可以不在声明时赋值即可以先声明后赋值。value3时一个引用变量这里我们可以看到final修饰引用变量时只是限定了引用变量的引用不可改变即不能将value3再次引用另一个Value对象但是引用的对象的值是可以改变的从内存模型中我们看的更加清晰 上图中final修饰的值用粗线条的边框表示它的值是不可改变的我们知道引用变量的值实际上是它所引用的对象的地址也就是说该地址的值是不可改变的从而说明了为什么引用变量不可以改变引用对象。而实际引用的对象实际上是不受final关键字的影响的所以它的值是可以改变的。 另一方面我们看到了用final修饰成员变量时的细微差别因为final修饰的数据的值是不可改变的所以我们必须确保在使用前就已经对成员变量赋值了。因此对于final修饰的成员变量我们有且只有两个地方可以给它赋值一个是声明该成员时赋值另一个是在构造方法中赋值在这两个地方我们必须给它们赋初始值。 最后我们需要注意的一点是同时使用static和final修饰的成员在内存中只占据一段不能改变的存储空间。 2.修饰方法参数 前面我们可以看到如果变量是我们自己创建的那么使用final修饰表示我们只会给它赋值一次且不会改变变量的值。那么如果变量是作为参数传入的我们怎么保证它的值不会改变呢这就用到了final的第二种用法即在我们编写方法时可以在参数前面添加final关键字它表示在整个方法中我们不会实际上是不能改变参数的值 public class FinalTest {
/spanspan stylecolor: #008000;/*/spanspan stylecolor: #008000; ... /spanspan stylecolor: #008000;*//spanspan stylecolor: #0000ff;public/span span stylecolor: #0000ff;void/span finalFunc(span stylecolor: #0000ff;final/span span stylecolor: #0000ff;int/span i, span stylecolor: #0000ff;final/spanspan stylecolor: #000000; Value value) {/spanspan stylecolor: #008000;///spanspan stylecolor: #008000; i 5; 不能改变i的值/spanspan stylecolor: #008000;///spanspan stylecolor: #008000; v new Value(); 不能改变v的值/spanvalue.v 5; span stylecolor: #008000;///spanspan stylecolor: #008000; 可以改变引用对象的值/span} } 3.修饰方法
第三种方式即用final关键字修饰方法它表示该方法不能被覆盖。这种使用方式主要是从设计的角度考虑即明确告诉其他可能会继承该类的程序员不希望他们去覆盖这个方法。这种方式我们很容易理解然而关于private和final关键字还有一点联系这就是类中所有的private方法都隐式地指定为是final的由于无法在类外使用private方法所以也就无法覆盖它。
4.修饰类
了解了final关键字的其他用法我们很容易可以想到使用final关键字修饰类的作用那就是用final修饰的类是无法被继承的。
上面我们讲解了final的四种用法然而对于第三种和第四种用法我们却甚少使用。这不是没有道理的从final的设计来讲这两种用法甚至可以说是鸡肋因为对于开发人员来讲如果我们写的类被继承的越多就说明我们写的类越有价值越成功。即使是从设计的角度来讲也没有必要将一个类设计为不可继承的。Java标准库就是一个很好的反例特别是Java 1.0/1.1中Vector类被如此广泛的运用如果所有的方法均未被指定为final的话它可能会更加有用。如此有用的类我们很容易想到去继承和重写他们然而由于final的作用导致我们对Vector类的扩展受到了一些阻碍导致了Vector并没有完全发挥它应有的全部价值。
总结
final关键字是我们经常使用的关键字之一它的用法有很多但是并不是每一种用法都值得我们去广泛使用。它的主要用法有以下四种
用来修饰数据包括成员变量和局部变量该变量只能被赋值一次且它的值无法被改变。对于成员变量来讲我们必须在声明时或者构造方法中对它赋值用来修饰方法参数表示在变量的生存期中它的值不能被改变修饰方法表示该方法无法被重写修饰类表示该类无法被继承。
上面的四种方法中第三种和第四种方法需要谨慎使用因为在大多数情况下如果是仅仅为了一点设计上的考虑我们并不需要使用final来修饰方法和类。