final修饰的类是不能被篡改的
时间:2021-05-07

1.finalvariable。

finalvariable是常量,一旦初始化就不能改变。

class Test1 {

 final double PI = 3.14; //常量的名称最好大写

 

 public Test1(){

  PI = 3.14;

 }

 

  void test(){

   System.out.println("PI is: " + PI);

  }

 

 public static void main(String[] args){

  Test1 t = new Test1();

  t.test();

 }

}

输出:

PI is: 3.14

(1)Blankfinalvariable。

声明中没有初始化的finalvariable被称为blankfinalvariable,blankfinalvariable必须在构造函数中初始化,否则编译错误就会被抛弃。

class Test1 {

 final double PI;

 

 Test1(){

 PI = 3.14; //在构造函数中初始化

 }

 

  void test(){

   System.out.println("PI is: " + PI);

  }

 

 public static void main(String[] args){

 Test1 t = new Test1();

 t.test();

 }

}

输出:

PI is: 3.14

(2)Uninitializedstaticfinalvariable。

声明阶段没有初始化的staticfinalvariable只能在静态代码块中初始化。

class Test1 {

 static final double PI;

 

 static {

 PI = 3.14;

 }

 

  void test(){

   System.out.println("PI is: " + PI);

  }

 

 public static void main(String[] args){

 Test1 t = new Test1();

 t.test();

 }

}

输出:

PI is: 3.14

2.finalmethod。

finalmethod无法覆盖。这就是说,子类可以调用父类fianlmethod,但无法覆盖。

输出:

三、finalclass

finalcalss不能继承。

class Test {

 static final double PI = 3.14;

 

  final void test(){

   System.out.println("PI is: " + PI);

  }

}

 

class Test1 extends Test{

 

 public static void main(String[] args){

 Test1 t = new Test1();

 t.test();

 }

}

输出:

PI is: 3.14

为什么java.lang.String类被设计成final?

f

首先要清楚final这个关键词。


final的出现是为了不想改变,不想改变的理由有设计和效率两个。final修饰的类别不能继承,所以final修饰的类别不能篡改。

理解了这一点,我们再来看问题:

(1)从设计上讲,

a、确保他们不会在子类中改变语义。String类别是final类别,这意味着不允许任何人定义String类别。换句话说,如果有一个String引用,它必须引用一个String对象,而不是其他类别的对象。

一旦创建了String,就不能进行修改,因为java设计者可以共享String,下面是源代码中的注释:

(2)从效率上讲:

设计成final,JVM不需要在虚函数表中查询相关方法,而是直接将其定位为String类相关方法,提高了执行效率。

Java设计师认为分享会带来更高的效率。

综上所述,要保证java.lang.String引用的对象一定是java.lang.String的对象,而不是后代,从而保证其效率和安全性。