一、理解final

望文生义,final意为“最终的,最后的”,我理解为“不能被改变的”,它可以修饰类、变量和方法。

所以我是否可以理解为被它所修饰的类、变量和方法都不能被改变呢?答案是”是“,因为有以下约束条件的存在:

1、final修饰类

被final修饰的类不能被继承,即它不能拥有自己的子类,否在会在编译期间报错。且看下面的例子:

第一步:创建一个用final修饰的父类Father

string类为啥是final的

第二步:创建一个子类Son继承Father

string类为啥是final的

如图所示,我们看到了报警信息,点进去一看,如下图所示:

string类为啥是final的

意思就是类Son不能继承被final修饰的类Father,上面的结论得以印证。

2、final修饰方法

被final修饰的方法不能被重写

详情且看下面的实例:

(一)父类中的方法控制权限为public

第一步:在Father类中创建一个方法,并用final修饰

string类为啥是final的

第二步:用类Son继承类Father并重写work方法

string类为啥是final的

可以看到当子类重写父类中用final修饰的方法时,报错了,报错信息如下:

string类为啥是final的

即子类不能重写父类中被final修饰的方法

 3、final修饰变量

final修饰的变量,无论是类属性、对象属性、形参还是局部变量,都需要进行初始化操作。

(1)修饰变量

string类为啥是final的

可以看到被final修饰的变量报错了,报错信息如下:

string类为啥是final的

意为被final修饰的字段language没有被初始化,所以当变量被final修饰时要赋值初始化,如下:

string类为啥是final的

(2)修饰类属性

类属性可以理解为一个将一个类作为另一个类的属性

第一步:先创建一个特征类

string类为啥是final的

第二步:将特征类Feature设置为Son类的属性,并用final修饰

string类为啥是final的

同样当类属性用final修饰时报错了,报错信息如下:

string类为啥是final的

同样,报错信息为没有进行对final修饰的类进行初始化,下面看一下不用final修饰时是否报错:

string类为啥是final的

很明显,答案是没有,那再来看一下当初始化Feature类后又会是怎样的?

string类为啥是final的

可以看到,初始化用fina修饰的属性类后并没有报错,上面的结论也得以印证了!

二、解答问题

结合以上基础知识,我们来分析一下为什么String类是final的?

首先来看一个例子:

string类为啥是final的

上面这个例子,是让一个普通类继承String类,结果发现报错了,错误信息如下:

string类为啥是final的

即类String1不能是final类String的子类,这里已经很明显地看出String类是final的,但是到底是为了什么呢?先给出答案吧:

主要是为了”安全性“和”效率“的缘故,因为:

1、由于String类不能被继承,所以就不会没修改,这就避免了因为继承引起的安全隐患;

2、String类在程序中出现的频率比较高,如果为了避免安全隐患,在它每次出现时都用final来修饰,这无疑会降低程序的执行效率,所以干脆直接将其设为final一提高效率;

 

 

 

又会有这么一个问题, string类为 是final的,为什么可以随便赋值? 

final类是不能被其他类继承而已。
是可以赋值的,不过只能赋值一次而已。String 就是常量。
String a = "aaa";
a = "bbb"
a变量并不是重新赋值,只是指向另一个字符串而已。

当你第二次为一个String变量赋值时,实际上是重新创建的一个String对象,将这个新创建的对象引用赋值给之前的String变量,也就是说这个时候产生了两个对象,而不是同一个对象改变了值。

 

 

 

https://www.cnblogs.com/hellowhy/p/6536590.html

相关文章:

  • 2021-09-16
  • 2021-10-20
  • 2022-01-18
  • 2021-11-15
  • 2022-12-23
  • 2021-10-18
  • 2021-06-17
  • 2021-12-01
猜你喜欢
  • 2021-06-05
  • 2022-12-23
  • 2022-12-23
  • 2021-07-25
相关资源
相似解决方案