刚看到这道题时,自己也是有点懵逼的,也不清楚答案,便赶紧去百度final的用法,然后看了很多回答和实例才只知道了答案! 首先我们来看下 final关键字的用法,然后再来回答这道题! 1.final 关键字可以用来修饰 类,方法和变量(成员变量和局部变量) 那么我们来讨论下,final关键字几种用法
修饰类
final修饰类时,说明该类你不想被别人继承!一个类不被别的类继承就可以使用final来修饰,测试结果如下图
注意 final类中的所有成员方法都会被隐式地指定为final方法。
修饰方法
当一个方法被final修饰后,就代表该方法无法被重写,如果你想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的,可以看下图示例
你就无法重写该方法了,但是!同时注意 如果父类的 final修饰的方法设置为private,则子类可以写一个同名的方法,此时 ,该同名的方法不再产生final的报错,而是在子类重新定义了一个方法(注:类的private方法会隐式地被指定为final方法。)见下图
修饰变量
这里就是比较重要的点了,也和我们开头说的那道面试题有很大的关系,理解了这个,就不难理解这道面试题的答案了 被final修饰的变量其实就相当于定义了一个常量,无法被修改的变量,如果final修饰的是一个基本数据类型的变量,那么这个变量的值就定了,不能变了,而如果修饰的是一个引用变量,那么该变量存的是一个内存地址,该地址就不能变了,但是该内存地址所指向的那个对象还是可以变的,就像你记住了人家的门牌号,但你不能管人家家里人员数量,有个例子 看下图
但是你可以改那个对象的内容!见下图
还有的人给方法定义的参数是 final类型的,是不想别人在方法内部修改参数的值,如果final修饰的是一个基本类型,那么是可以的,如果修饰的是引用类型,那么便不行了,因为就如上文那个str.append 对象的内容是可以变化的!