- 浏览: 543129 次
- 性别:
- 来自: 广州
-
文章分类
最新评论
-
wenming6688:
垃圾。。。。。。
Java中的this和super[转] -
yingjianxuehun:
gszp852 写道请问下,服务器的字符编码在哪设置,我也遇到 ...
ognl.MethodFailedException: Method "setEndtime" failed for object -
zxjlwt:
有在osgi中用过吗?http://surenpi.com
no security manager: RMI class loader disabled -
samuce:
谢谢,终于找到问题结果!
taglib prefix="s" uri="/struts-tags" -
gszp852:
请问下,服务器的字符编码在哪设置,我也遇到了这个问题。不知道是 ...
ognl.MethodFailedException: Method "setEndtime" failed for object
许多程序设计语言都有自己的办法告诉编译器某个数据是“常数”。常数主要应用于下述两个方面:
(1) 编译期常数,它永远不会改变
(2) 在运行期初始化的一个值,我们不希望它发生变化
对于编译期的常数,编译器(程序)可将常数值“封装”到需要的计算过程里。也就是说,计算可在编译期间提前执行,从而节省运行时的一些开销(这个应该是static final 吧。。。我的想法错了的,编译期间执行和加载时执行是不同的,在编译时执行的必须是基本数据类型)。在Java中,这些形式的常数必须属于基本数据类型(Primitives),而且要用final关键字进行表达。在对这样的一个常数进行定义的时候,必须给出一个值。
无论static还是final字段,都只能存储一个数据,而且不得改变。
若随同对象句柄使用final,而不是基本数据类型,它的含义就稍微让人有点儿迷糊了。对于基本数据类型,final会将值变成一个常数;但对于对象句柄, final会将句柄变成一个常数。进行声明时,必须将句柄初始化到一个具体的对象。而且永远不能将句柄变成指向另一个对象。然而,对象本身是可以修改的。 Java对此未提供任何手段,可将一个对象直接变成一个常数(但是,我们可自己编写一个类,使其中的对象具有“常数”效果)。这一限制也适用于数组,它也属于对象。
下面是演示final字段用法的一个例子:
package finaldata; //: FinalData.java //The effect of final on fields class Value { int i = 1; } public class FinalData { // Can be compile-time constants final int i1 = 9; static final int I2 = 99; // Typical public constant: public static final int I3 = 39; // Cannot be compile-time constants: final int i4 = (int) (Math.random() * 20); static final int i5 = (int) (Math.random() * 20); Value v1 = new Value(); final Value v2 = new Value(); static final Value v3 = new Value(); // ! final Value v4; // Pre-Java 1.1 Error: // no initializer // Arrays: final int[] a = { 1, 2, 3, 4, 5, 6 }; public void print(String id) { System.out.println(id + ": " + "i4 = " + i4 + ", i5 = " + i5); } public static void main(String[] args) { FinalData fd1 = new FinalData(); // ! fd1.i1++; // Error: can‘t change value fd1.v2.i++; // Object isn‘t constant! fd1.v1 = new Value(); // OK -- not final for (int i = 0; i < fd1.a.length; i++) fd1.a[i]++; // Object isn‘t constant! // ! fd1.v2 = new Value(); // Error: Can‘t // ! fd1.v3 = new Value(); // change handle // ! fd1.a = new int[3]; fd1.print("fd1"); System.out.println("Creating new FinalData"); FinalData fd2 = new FinalData(); fd1.print("fd1"); fd2.print("fd2"); FinalData fd3 = new FinalData(); fd3.print("fd3"); //fd3.i1++; //fd2.i4++; System.out.println(fd3.a[1]); fd3.a[1]++; System.out.println(fd3.a[1]); } } // /:~
由于i1和I2都是具有final属性的基本数据类型,并含有编译期的值,所以它们除了能作为编译期的常数使用外,在任何导入方式中也不会出现任何不同。I3是我们体验此类常数定义时更典型的一种方式:public表示它们可在包外使用;Static强调它们只有一个;而 final表明它是一个常数。注意对于含有固定初始化值(即编译期常数)的fianl static基本数据类型,它们的名字根据规则要全部采用大写。也要注意i5在编译期间是未知的,所以它没有大写。
不能由于某样东西的属性是 final,就认定它的值能在编译时期知道。i4和i5向大家证明了这一点。它们在运行期间使用随机生成的数字。例子的这一部分也向大家揭示出将 final值设为static和非static之间的差异。只有当值在运行期间初始化的前提下,这种差异才会揭示出来。因为编译期间的值被编译器认为是相同的。这种差异可从输出结果中看出:
fd1: i4 = 15, i5 = 9
Creating new FinalData
fd1: i4 = 15, i5 = 9
fd2: i4 = 10, i5 = 9
注意对于fd1和fd2来说,i4的值是唯一的,但i5的值不会由于创建了另一个FinalData对象而发生改变。那是因为它的属性是static,而且在载入时初始化,而非每创建一个对象时初始化。
从v1 到v4的变量向我们揭示出final句柄的含义。正如大家在main()中看到的那样,并不能认为由于v2属于final,所以就不能再改变它的值。然而,我们确实不能再将v2绑定到一个新对象,因为它的属性是final。这便是final对于一个句柄的确切含义。我们会发现同样的含义亦适用于数组,后者只不过是另一种类型的句柄而已。将句柄变成final看起来似乎不如将基本数据类型变成final那么有用。
2. 空白final
Java 1.1允许我们创建“空白final”,它们属于一些特殊的字段。尽管被声明成final,但却未得到一个初始值。无论在哪种情况下,空白final都必须在实际使用前得到正确的初始化。而且编译器会主动保证这一规定得以贯彻。然而,对于final关键字的各种应用,空白final具有最大的灵活性。举个例子来说,位于类内部的一个final字段现在对每个对象都可以有所不同,同时依然保持其“不变”的本质。下面列出一个例子:
//: BlankFinal.java // "Blank" final data members class Poppet { } class BlankFinal { final int i = 0; // Initialized final final int j; // Blank final final Poppet p; // Blank final handle // Blank finals MUST be initialized // in the constructor: BlankFinal() { j = 1; // Initialize blank final p = new Poppet(); } BlankFinal(int x) { j = x; // Initialize blank final p = new Poppet(); } public static void main(String[] args) { BlankFinal bf = new BlankFinal(); } } ///:~
现在强行要求我们对final进行赋值处理——要么在定义字段时使用一个表达 式,要么在每个构建器中。这样就可以确保final字段在使用前获得正确的初始化。
3. final自变量
Java 1.1允许我们将自变量设成final属性,方法是在自变量列表中对它们进行适当的声明。这意味着在一个方法的内部,我们不能改变自变量句柄指向的东西。如下所示:
//: FinalArguments.java // Using "final" with method arguments class Gizmo { public void spin() {} } public class FinalArguments { void with(final Gizmo g) { //! g = new Gizmo(); // Illegal -- g is final g.spin(); } void without(Gizmo g) { g = new Gizmo(); // OK -- g not final g.spin(); } // void f(final int i) { i++; } // Can‘t change // You can only read from a final 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自变量分配一个null(空)句柄,同时编译器不会捕获它。这与我们对非final自变量采取的操作是一样的。
方法f()和g()向我们展示出基本类型的自变量为final时会发生什么情况:我们只能读取自变量,不可改变它。
发表评论
-
深入探讨Java类型提升的约定[转]
2010-09-30 10:28 968转: http://doc.chinaunix.net ... -
java 条件表达式(即三元操作符)的陷阱[转]
2010-09-30 10:22 8419转: http://apps.hi.baidu.com/s ... -
response的 encodeUrl方法的使用[转]
2010-09-29 11:17 1363转自 :http://edu.codepub.com/2009 ... -
java序列化的作用[转]
2010-09-20 11:31 1172转: http://hi.baidu.com/springwu ... -
java transient简介[转]
2010-09-20 11:22 1422转:http://blog.csdn.net/zxl315 ... -
Collection和Collections的区别[转]
2010-09-17 15:37 1456转: http://hanhongke123.blog.163 ... -
HashMap和HashTable的区别[转]
2010-09-17 15:24 1055转: Hashtable和HashMap类有三个重要的不同 ... -
Java 中Vector、ArrayList和LinkedList 的区别[转]
2010-09-17 14:43 1601转:http://pterodactyl.iteye.com/ ... -
Java中ArrayList和LinkedList区别[转]
2010-09-17 12:01 1112转:http://pengcqu.iteye.com/bl ... -
String 中的split()[转]
2010-09-12 22:38 650转:http://www.iteye.com/topic/32 ... -
Java中的this和super[转]
2010-09-09 16:41 1234转自:http://student.csdn.ne ... -
java继承容易犯的错误[转]
2010-09-09 09:32 1061在网上看见一个关于java ... -
Java内部类与匿名内部类
2010-09-08 15:19 973定义在类中方法之外的内部类分为实例内部类和静态内部 ... -
javap的使用
2010-09-08 14:48 1204javap是jdk自带的一个工具,可以反编译,也可以查看jav ... -
JAVA匿名内部类(from thinking in java 3th)[转]
2010-09-08 14:13 1263简单地说:匿名内部类 ... -
Java内部类
2010-09-05 17:32 1411在一个类内部定义类,这就是嵌套类(nested classes ... -
java 静态块 非静态块
2010-08-22 16:41 1879转自:http://blog.sina.com.cn/s/bl ... -
java static
2010-08-22 16:20 999请先看下面这段程序:public class Hello{ p ... -
JNDI API
2010-08-20 14:40 1078JNDI API由5个包组成: 1、Javax.nami ... -
理解JNDI中 java:comp/env/jdbc/datasource 与 jdbc/datas
2010-08-20 14:34 972http://futureinhands.iteye.com/ ...
相关推荐
Java中的final关键字是一个非常重要的修饰符,它用于声明变量、方法和类,确保它们在程序执行期间保持不变。final关键字在Java编程中的应用广泛,可以帮助提高代码的稳定性和可维护性。 1. **常量的声明** final...
Java中的`final`和`static`关键字是编程中非常重要的两个修饰符,它们分别用于不同的场景,以确保代码的稳定性和高效性。 首先,`final`关键字主要用于表示不可变性。它可以用来修饰类、方法和变量。对于类,如果一...
总之,`final`和`static`是Java中不可或缺的关键字,它们各自有其特定的使用场景。理解并正确使用它们可以提高代码的可读性、安全性和效率。在设计类和接口时,明智地使用`final`和`static`可以帮助实现更好的设计...
final 关键字在 Java 中有多种用法,包括修饰变量、方法、类等。下面是 final 关键字的各种用法: 1. final 修饰变量:表示该变量一旦被初始化,程序无法修改变量的值,该变量变成了一个常量。注意,系统不会默认为...
java中final和static讲解及实例
`final`关键字在Java中有多种用途,它可以用来修饰类、方法和变量,其主要目的是确保被修饰的对象具有不可变性或只读性。 #### 1. `final`修饰变量 当`final`用于修饰一个变量时,该变量成为常量,一旦赋值后就不...
总的来说,`final`关键字是Java中的一种强约束,它用于防止代码被意外修改,增强程序的稳定性和可预测性。理解并适当地使用`final`可以帮助编写出更加安全、高效且易于维护的代码。在实际开发中,应根据需求灵活运用...
Java中final类的简单使用,并对Java关键字的使用做出了总结
总结来说,`final`关键字在Java中扮演了多种角色,包括创建不可变变量、常量、对象和数组,确保方法和类的不可覆盖性,以及在多线程环境中的安全性。正确使用`final`能够提高代码的清晰度、稳定性和性能。
Java中的`final`关键字是一个非常重要的概念,它用于表示不可变性或终结状态。下面我们将详细探讨`final`关键字在修饰变量、方法和类时的不同用法。 1. **final变量** - 常量定义:`final`变量一旦被初始化后,其...
Java 中的 `final` 关键字是一个至关重要的概念,它被用来声明类、方法和变量,以确保它们在程序执行过程中不可更改。深入理解 `final` 关键字可以帮助开发者写出更加安全、高效的代码。 首先,`final` 关键字可以...
在 Java 编程语言中,final 和 static 是两个非常重要的关键字,它们可以用来修饰类、方法、变量等,了解它们的使用方法和限制非常重要。本文将详细总结 final 和 static 的使用方法和限制。 一、final 关键字 ...
在Java编程语言中,`static`, `this`, `super`, 和 `final` 是四个非常重要的关键字,它们分别代表不同的概念并具有特殊的用法。 一、`static` `static` 关键字用于声明类级别的成员(变量或方法),这意味着它们...
在本篇文章中,我们将深入探讨`final`关键字在Java中的使用和意义。 首先,`final`关键字用于声明一个不可变的对象。当应用于变量时,它表示该变量一旦被初始化后就不能再改变其值。例如: ```java final int ...
- **示例**:在Java中,可以使用`getBytes(String charsetName)`方法将字符串编码为指定字符集的字节数组;使用`new String(byte[] bytes, String charsetName)`方法将字节数组解码为字符串。 #### 2.2 字节序标记...
在Java中,final可以用来修饰类、方法、变量和参数,以实现特定的编程需求。以下是对final关键字在各个场景下用法的详细说明: 1. **final修饰类** - 当一个类被final修饰时,它不能被其他类继承。这意味着final类...
Java中的`final`关键字是一个非常重要的修饰符,它在编程中起到了确保不变性的关键作用。在本文中,我们将深入探讨`final`关键字的用途和用法。 首先,`final`可以用于修饰类、方法和变量。当`final`应用于类时,...
例如,Java中的`String`类就是`final`的。 ```java public final class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton ...