以下是Object.class里的一段代码
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
} if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
} if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
timeout++;
} wait(timeout);
}
我知道final是声明常量和最终对象(不可继承对象)的关键字。
请问wait方法前的final在这里有什么意义?
还有final声明一个对象又有什么意义呢?
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
} if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
} if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
timeout++;
} wait(timeout);
}
我知道final是声明常量和最终对象(不可继承对象)的关键字。
请问wait方法前的final在这里有什么意义?
还有final声明一个对象又有什么意义呢?
使用final方法的原因有二:
第一、把方法锁定,防止任何继承类修改它的意义和实现。
第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。
例如: Java codepublic class Test1 { public static void main(String[] args) {
// TODO 自动生成方法存根
} public void f1() {
System.out.println("f1");
}
//无法被子类覆盖的方法
public final void f2() {
System.out.println("f2");
} public void f3() {
System.out.println("f3");
} private void f4() {
System.out.println("f4");
}
} public class Test2 extends Test1 { public void f1(){
System.out.println("Test1父类方法f1被覆盖!");
} public static void main(String[] args) {
Test2 t=new Test2();
t.f1();
t.f2(); //调用从父类继承过来的final方法
t.f3(); //调用从父类继承过来的方法
//t.f4(); //调用失败,无法从父类继承获得 }
} 这个是我以前从csdn上看到的 你搜搜看说的很详细很好的
比如final int a=5;
则a不能被重新赋值.
如
final StringBuilder builder = new StringBuilder("Hello ");
则builder不能再指向别的对象.但是对象的内容可以改变,比如你可以
builder.append("World!");
外部再也不能修改和覆盖这个方法
打个比方说:不管你开什么牌子的汽车 我就规定了开汽车的方法就这个一个
还有final声明一个对象又有什么意义呢?
同理 外部再也不能修改和覆盖这个对象