Java中的final关键字
来源:互联网 发布:手机视频拼接软件 编辑:程序博客网 时间:2024/06/16 05:38
final关键字在Java中十分重要,是一个常用的修饰符。
final关键字的作用范围
final关键字可以用于修饰类、字段、方法,当用于类上时,此类就成为了不可继承的最终类,用于方法时就成了不能覆写的最终方法,用于字段时,就成了最终的变量,只能在初始化的时候赋值,而不能在之后重新赋值。
final类
final修饰的类不可继承,无法有子类。Java中封装的思想是将类的属性和方法的实现细节隐藏起来,但是继承却破坏了封装,使子类可以继承父类的方法和字段。为了解决这个问题,所以出现了final关键字,final关键字修饰的类,无法有子类,也就没有了破坏封装的问题。一般使用于工具类和基本数据类型上,比如String类和Integer等表示数据的类即不可继承。在String类的源码上可以看到:
public final class String
以及Integer类的声明:
public final class Integer extends Number implements Comparable<Integer>
可以看到以上两个类都是final类,因此无法继承。final类一般有几个特点,如:
1、某个类不是专门为继承而设计的,比如String等表示数据的类。
2、有时候出于安全考虑,类的属性和实现细节不允许类改动的,使用final可以防止通过继承的方式覆写父类的方法,从而改变源代码的实现。
3、确定现在以及以后此类都不会被继承,比如工具类。
final class Person {}class Student extends Person {//错误用法,无法继承final类}
final修饰的方法
final修饰的方法不能覆写,这也是针对继承来说的,因为没有继承就不会存在覆写的概念。当有一些方法是父类已经提供好了的,不允许子类改写的,就可以使用final关键字修饰,子类无法覆写此方法,只能使用父类提供的,从而防止子类修改这个方法的实现。
class Person { public final String name = "无名氏"; public final void sayHello(){ System.out.println("这是一个最终的方法,子类无法覆写"); }}class Student extends Person{ public void sayHello(){ System.out.println("此方法将会报错,无法覆写父类方法"); }}
final修饰的变量
final修饰的变量只能在声明的时候赋初值,之后就不可以再次赋值。一般会加上static修饰符使用,让外界可以用类名直接调用这个变量,无需创建实体。
public class StaticDemo { public static void main(String[] args) { Person p = new Person(); p.name="赋值失败,无法给最终变量赋值"; }}class Person { public final String name = "无名氏";}
和static的关系
final一般会和static一起使用,static是静态修饰符,可以将一个方法或者变量提升为整个类的成员,而一般不能改变的方法或变量都是高度集中的,因此需要static将这个方法或者变量提升为类的成员。例如数组排序方法,可以使用static关键字将其提升为类成员,其他地方即可使用类名直接调用,而无需专门创建一个工具类的实体。
public class StaticDemo { public static void main(String[] args) { System.out.println(Person.name);//可以用类名调用 }}class Person { public final static String name = "无名氏";}
- Java中的final关键字
- JAVA中的关键字FINAL
- java中的final关键字
- java中的final关键字
- java中的final关键字
- JAVA中的final关键字
- java中的final关键字
- JAVA中的final关键字
- Java中的final关键字
- Java 中的关键字 final
- Java中的final关键字
- Java中的final关键字
- Java中的final关键字
- Java中的final关键字
- java 中的final关键字
- JAVA中的final关键字
- JAVA中的final关键字
- Java中的关键字final
- 数据库中表和视图的区别和联系
- 彻底弄懂JS的事件冒泡和事件捕获
- Unityeditor 事件(2)
- Django模板实现树状数据渲染
- boost 编写finger服务
- Java中的final关键字
- 图像处理算法(三)---图像常用操作
- mysql读写分离总结
- Spring中使用JdbcTemplate操作数据库
- Ubuntu下利用pip配置xgboost
- const理解
- c++第二次试验-本月有几天
- HihoCoder 状态压缩一
- JAVASE--04--多态,抽想类,接口