Java面向对象编程中final关键字的使用方法详解
|
在Java中通过final关键字来声明对象具有不变性(immutable),这里的对象包括变量,方法,类,与C++中的const关键字效果类似。
final 变量
class Circle {
static final double PI = 3.1415926;
final int radius = 5;
final int xPos;
final int yPos;
public Circle(int x,int y) {
xPos = x;
yPos = y;
}
}
final 方法
class BaseClass {
public final void method() {}
}
class DerivedClass extends BaseClass {
public final void method() {} // 编译出错
}
需要注意的是,final方法的定义不一定能够产生inline的效果,因为方法是否inline取决于JVM的策略,而非final关键字,通过final的设计提高方法效率是不准确的。 final 类 复制代码 代码如下:
内部类与final
public class Wrapper {
public static void main(String[] args) {
// Object obj = null; //编译出错
final Object obj = null;
new Thread(new Runnable() {
public void run() {
obj = "hello";
}
}).start();
}
}
PS:内部匿名类无法访问外面的非 final 的变量的问题 之所以会想起这个题目只要是最近在阅读 JDK 源码中关于 HTTP keepalive 的代码时,其中一个源文件 sun.net.www.protocol.http.HttpURLConnection.java 无意中看到下面这段代码。
final boolean result[] = {false};
java.security.AccessController.doPrivileged(new java.security.PrivilegedAction() {
public Object run() {
try {
InetAddress a1 = InetAddress.getByName(h1);
InetAddress a2 = InetAddress.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 class
public 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 的一些限制
(编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
