java final关键字
final关键字的含义是什么?
final关键字通常指“这是无法改变的”。主要用于设计或者优化。但是随着java的发展,优化的功能基本无效了。
final关键字的用法有哪些?
- final数据:数据具有只读性。
- final方法:方法不可被覆盖。(private方法隐含final效果)
- final类:类不可被继承。
final关键字具体怎么用?
final关键字用法如下:Test0507.java
class Value{//final数据具有只读性。
int i;
Value(int i){this.i=i;}
}
public class Test0507{
String id;
Test0507(String id){this.id=id;}
final int i=1;//编译期常量
static final int VALUE_I=2;//编译期常量
final int j=(int)(Math.random()*100)+1;//每次初始化都给变量随机赋值
static final int VALUE_J=(int)(Math.random()*100)+1;//static成员只会初始化一次,所以值不会变
final Value k=new Value(3);//final使引用恒定不变,但其自身可以被修改
static final Value VALUE_K=new Value(4);
public String toString(){
return id+": j= "+j+",VALUE_J= "+VALUE_J;
}
public static void main(String[] args){
Test0507 t1=new Test0507("t1");
System.out.println(t1);
Test0507 t2=new Test0507("t2");
System.out.println(t1);
System.out.println(t2);
//t1.i=2;//错误:无法为最终变量i指定值
//VALUE_I=3;//错误:无法为最终变量VALUE_I指定值
//t1.k=new Value(5);//错误:无法为最终变量k指定值
//VALUE_K=new Value(5);//错误:无法为最终变量VALUE_K指定值
System.out.println("t1.k.i= "+t1.k.i);
System.out.println("t1.VALUE_K.i= "+t1.VALUE_K.i);
t1.k.i=2;//final使引用恒定不变,但其自身可以被修改
t1.VALUE_K.i=3;
System.out.println("t1.k.i= "+t1.k.i);
System.out.println("t1.VALUE_K.i= "+t1.VALUE_K.i);
}
}
class Value{//空白final的用法
static int i;
Value(int i){this.i=i;}
}
public class Test0507{
final int i=1;
//final int j;//空白final必须在每个构造器中得到赋值,不然无法通过编译
final int z;//空白final
final Value v;//空白final
Test0507(){//在构造器中给所有空白final赋值
z=2;
v=new Value(2);
System.out.format("z=%d,v=%s,v.i=%d\n",z,v,v.i);
}
Test0507(int i){//在构造器中给所有空白final赋值
z=i;
v=new Value(i);
System.out.format("z=%d,v=%s,v.i=%d\n",z,v,v.i);
}
public static void main(String[] args){
new Test0507();
new Test0507(3);
}
}
class Value{//fianl参数不能修改参数,主要用来向匿名内部类传递数据。
void f(){}
}
public class Test0507{
void with(final Value v){
//v=new Value();//不能指定最终参数v
}
void without(Value v){
v=new Value();
v.f();
}
public static void main(String[] args){
}
}
class Person extends Test0507{//final方法不可被覆盖
void f(){System.out.println("Person.f()");}//错误:Person中的f()无法覆盖Test0507中的f(),被覆盖的方法为final。
}
public class Test0507 {
final void f(){System.out.println("Test0507.f()");}//final方法
}
class Person extends Test0507{//private方法隐含final效果
void f(){System.out.println("Person.f()");}//编译能通过,但不能覆盖方法,而是产生一个新方法f()
void g(){System.out.println("Person.g()");}
}
public class Test0507{
private void f(){System.out.println("Test0507.f()");}
void g(){System.out.println("Test0507.g()");}
public static void main(String[] args){
Test0507 t=new Person();
t.f();//Test0507.f()
t.g();//Person.g()
new Person().f();//Person.f()
}
}
final class Person{//final类不可被继承
static int i=1;//静态变量
}
//class Teacher extends Person{}//错误:无法从最终Person进行继承
public class Test0507{
public static void main(String[] args){
int i=Person.i;
System.out.println("i="+i);
int j=Person.i=2;//变量不受影响
System.out.println("i=j="+j);
}
}