Java是由C/C++泛生的,其也保留了C/C++的部分特性,如关键字。在C/C++中,关键字有着特殊的含义。

final修饰符

在编程中,一般会存在一些变量或方法,程序员不让其数据“发生改变”,如数学计算要用到的圆周率,在编程时我们会给它一个固定值,但为了日后不被后其他人修改,就会用final来修饰这个“变量”,而被final修饰的“变量”称为常量

2.1final修饰属性

final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

2.1.1修饰成员变量

public class Person{
static final int age;
final int num;
final TestBoston test= new TestBoston();
static{
age = 10;
}
public Person(){
this.num = 0;
}
public Person(int num){
this.num = num;
}
public void setNum(int num){
this.num = num;//编译报错,因为类中所有构造器已经对num赋过值
}
public void goTestBost(TestBoston test){
this.test.setHost("ko");
int num = this.test.getNum();
this.test = test;//编译报错,不能修改引用变量指向的内存地址
}
}
public static void main(String[] args){
Person per1 = new Person();
Person per2 = new Person(12); per1.num = 23;//编译报错,不能再次赋值,已经通过无参构造器赋过值了
per2.num = 13;//编译报错,不能再次赋值,已经通过有参构造器赋过值了
}
  • 当使用final修饰成员变量时,必须对其显示初始化,要么在声明变量时给予初始值,要么在类的所有构造函数中对这个final变量赋初始值;
  • static final同时修饰的成员变量,要么在声明变量时给予初始值,要么在类中的静态代码块中赋值
  • 被final修饰的引用对象不能修改其指向的内存地址

2.1.2修饰形式参数

//假设main函数调用add方法,给num1、num2分别传参24,25
public int add(final int num1, final int num2){
num1 = num2++;//编译报错,不能再次赋值,再调用方法时已经给num1、num2赋过值了
return num1+num2;
}

final修饰的形式参数,只能在调用方法时对其传参,不能方法中重新给他赋值(num2++也是在给形参赋值)

2.2final修饰方法

public class Person{
public final void add(){}
private void go(){}//private final void go(){}
}
public class Student extends Person{
//编译报错,不能覆盖final修饰的方法
public void add(){}
}

用final修饰的方法可以被继承,但是不能被子类的重写;private方法都会隐式地指定为是final的,由于无法在类外使用private方法,所以也就无法覆盖它

2.3final修饰类

public final class Person{}
//编译报错,final修饰的类不能被继承
public class Student extends Person{}

用final修饰的类不能被继承,没有子类

final关键字主要用法总结

  1. 用于修饰成员变量或局部变量,被修饰的变量称为常量,只能被赋值一次且它的值无法被改变;对于成员变量来讲,必须在声明时或所有构造器中对它赋值;对于静态变量来讲,必须在声明时或静态代码块中对它赋值
  2. 用于修饰形式参数,调用方法时对其传参后的生存期里不能再被改变
  3. 修饰方法,表示该方法无法被重写;修饰类,表示该类无法被继承;

最新文章

  1. asp.net dataset 判断是否为空 ?
  2. 【原创Android游戏】NinOne V2.3.1 --加载模式的学习,界面的重新设计
  3. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【三】——Web Api入门
  4. android service被系统回收的解决方法
  5. Segmetation fault你来的真不是时候
  6. main函数的argc和argv
  7. android面试
  8. Web App 讲义教程
  9. HDU 2476 String painter(区间dp)
  10. delphi中左右翻转窗体(修改EXStyle)
  11. Qt-剪切板
  12. java集合基础
  13. Javascript中的Trait与代码重用
  14. GBK,UNICODE,GB2312,UTF-8学习总结
  15. HTML5中 HTML格式化/HTML样式/链表/表格-样式 韩俊强的博客
  16. [Swift]LeetCode773. 滑动谜题 | Sliding Puzzle
  17. spring security oauth2 client_credentials模
  18. 2019 Lonsdor K518S VS K518ISE
  19. UI组件--element-ui--Upload多组件自定义上传
  20. 使用JavaScript制作页面效果3

热门文章

  1. FFT通过傅里叶级数图解频域补零时域内插
  2. 初步认识微前端(single-spa 和 qiankun)
  3. uniapp 小程序全屏的实现
  4. NSString 类介绍及用法
  5. 出现Table ‘./mysql/proc’ is marked as crashed and should be repaired
  6. play的action链(一个action跳转到另一个action,类似于重定向)
  7. JetBrains官博:将从IntelliJ平台移除Log4j的依赖
  8. C++ 实现 Parsec
  9. SQLMAP配置洋葱路由
  10. ACM对抗赛有感