前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >学习笔记-JAVA-final关键字考点

学习笔记-JAVA-final关键字考点

作者头像
陈黎栋
发布2020-02-18 09:41:56
3230
发布2020-02-18 09:41:56
举报
文章被收录于专栏:陈黎栋的专栏啦

一、final修饰变量的原则

final可以修饰成员变量,也可以修饰局部变量、形参。final变量一旦获得初始值之后,final的变量就不能被重新赋值。

成员变量是随类初始化或对象初始化而初始化的,当执行静态初始化块时候可以对类属性进行赋初始值,当执行普通初始化块或者构造器的时候可以对实例属性赋初始值。因此成员变量的初始值可以在定义的时候赋值或者在初始化块、构造器中指定。

(3)对于final修饰的成员变量而言,一旦有了初始值之后,就不能被重新赋值,因此不可以在普通方法中对成员变量赋值。要么在定义的时候赋值,要么在方法块和构造器中赋值。

final成员变量,必须由程序员显示初始化,系统不会对final成员进行隐式初始化。

final修饰局部变量时既可以在定义时候指定默认值,也可以不指定,在后面指定,但只能一次。

final修饰基本类型的时候 变量不能改变

final修饰引用类型变量,final只保证这个引用的地址不变,即一直引用同一对象。但这个对象可以改变。

演练:

代码语言:javascript
复制
public void getGrade(){
 final int school;
 school=2;
 school=3;//这样就会报错,违反了原则(3)
 }
public static void main(String[] args) {
 StaticTest test=new StaticTest();
}
 
class MyClass{
2) final int value;
3) public MyClass(){}
4) public MyClass(int value){
5) this.value = value;
6) }
7) }
8) public class TestMain{
9) public static void main(String args[]){
10) MyClass mc = new MyClass(10);
11) System.out.println(mc.value);
12) }
13) }
选择正确答案:
A. 编译通过,输出10
B. 编译不通过,把第2 行改为final int value = 10;
C. 编译不通过,把第3 行改为public MyClass(){ value = 10; } 

C 加final的变量一定要被初始化。

代码语言:javascript
复制
class MyValue{
int value;
}
public class TestFinal{
public static void main(String args[]){
final MyValue mv = new MyValue();
mv.value = 100;
//1
System.out.println(mv.value);
}
}
下面说法正确的是:
A. 编译不通过
B. 编译通过。在//1 处加上:mv.value = 200; 则编译不通过
C. 编译通过。如果在//1 处加上:mv = new MyValue(); 则编译不通过。 

虽然MyValue的value成员变量默认private,但是因为????…..,所以可以在TestFinal类中使用my.value

答案:C

final MyValue mv = new MyValue(); 此处final修饰的是对象的引用。

使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

引用不能变,引用的变量还是可以变的。

fina lStringBuffer strBuffer =newStringBuffer("Hello");

执行如下语句将报告编译期错误:

strBuffer=newStringBuffer("");

但是,执行如下语句则可以通过编译:

strBuffer.append("world!");

所以,有人在定义方法的参数时,想采用如下形式来阻止方法内部修改传进来的参数对象:

publicvoidmethod(finalStringBufferparam) {

}

实际上,这是办不到的。因为仍然可以执行这样的代码:param.append("world!");

二、final修饰方法和类

final修饰方法不可以被重写 不希望子类重写父类的方法,可以使用final修饰。

final修饰的类不可以被继承。

Java修饰符 abstract,static,final 的区别详解http://www.jb51.net/article/41430.htm

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档