java局部变量被声明final_为局部变量声明final有意义吗?

概述

final在java中作为不可变语义的修饰词,接下来我们通过一段示例代码从字节码角度分析以下两点:

final在类中不同的地方声明是怎么样标识的?

为局部变量声明final有意义吗?

示例代码

public final class TestFinal {

private final int a = 10;

public final void testFinalMethod() {

System.out.println("testFinalMethod...");

}

public final void testFianlLocalVar() {

final Object obj = new Object();

}

}

复制代码

这段代码本身没有什么需要解读的, 我们来关注一下final声明在不同的位置,字节码层面是怎么标识的。

1. 声明final在类定义中

通过final修饰类, 根据虚拟机规范ClassFile结构如下:

ClassFile {

u4 magic;

u2 minor_version;

u2 major_version;

u2 constant_pool_count;

cp_info constant_pool[constant_pool_count-1];

u2 access_flags;

u2 this_class;

u2 super_class;

u2 interfaces_count;

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.标识符   程序员对程序中的各个元素加以命名时使用的命名记号称为标识符(identifier)。Java语言中,标识符是以字母,下划线(_),美元符($)开始的一个字符序列,后面可以跟字母,下划线,美元符,数字。例如,identifier,userName,User_Name,_sys_val, $change为合法的标识符,而2mail room#,class 为非法的标识符。  2.保留字   具有专门的意义和用途,不能当作一般的标识符使用,这些标识符称为保留字(reserved word),也称为关键字,下面列出了java语言中的所有保留字: abstract,break,byte,boolean,catch,case,class,char,continue,default,double,do,else,extends,false,final,float,for,finally,if,import,implements,int,interface,instanceof,long,length,native,new,null,package,private,protected,public,return,switch,synchronized,short,static,super,try,true,this,throw,throws,threadsafe,transient,void,while 。   java语言中的保留字均用小写字母表示。 2.1.2 数据类型概述 1. java中的数据类型划分  java语言的数据类型有简单类型和复合类型:  简单数据类型包括:     整数类型(Integer):byte, short, int, long      浮点类型(Floating):float,double      字符类型(Textual):char      布尔类型(Logical):boolean   复合数据类型包括:     class      interface      数组  2.常量和变量  常量:用保留字final来实现     final typeSpecifier varName=value[,varName[=value]…];                      如:final int NUM=100;   变量:是java 程序中的基本存储单元,它的定义包括变量名、变量类型和作用域几个部分。其定义格式如下:     typeSpecifier varName[=value[,varName[=value]…];                  如:int count; char c='a';   变量的作用域指明可访问该变量的一段代码,声明一个变量的同时也就指明了变量的作用域。按作用域来分,变量可以有下面几种:局部变量、类变量、方法参数和例外处理参数。在一个确定的域中,变量名应该是唯一的。局部变量在方法或方法的一个块代码中声明,它的作用域为它所在的代码块(整个方法或方法中的某块代码)。类变量在类中声明,而不是在类的某个方法中声明,它的作用域是整个类。方法参数传递给方法,它的作用域就是这个方法。例外处理参数传递给例外处理代码,它的作用域就是例外处理部分。 2.1.3 简单数据类型 1.布尔类型--boolean   布尔型数据只有两个值true和false,且它们不对应于任何整数值。布尔型变量的定义如:   boolean b=true;  2.字符类型--char   字符常量:  字符常量是用单引号括起来的一个字符,如'a','A';   字符型变量:  类型为char,它在机器中占16位,其范围为0~65535。字符型变量的定义如:   char c='a'; /*指定变量c为char型,且赋初值为'a'*/  3.整型数据    整型常量:  ◇ 十进制整数    如123,-456,0   ◇ 八进制整数    以0开头,如0123表示十进制数83,-011表示十进制数-9。  ◇ 十六进制整数    以0x或0X开头,如0x123表示十进制数291,-0X12表示十进制数-18。   整型变量: 数据类型 所占位数 数的范围 byte 8 -27~27-1 bhort 16 -215~215-1 int 32 -231~231-1 long 64 -263~263-1  4.浮点型(实型)数据   实型常量:  ◇ 十进制数形式    由数字和小数点组成,且必须有小数点,如0.123, 1.23, 123.0   ◇ 科学计数法形式    如:123e3或123E3,其中e或E之前必须有数字,且e或E后面的指数必须为整数。  ◇ float型的值,必须在数字后加f或F,如1.23f。   实型变量: 数据类型 所占位数 数的范围 float 32 3.4e-038 ~3.4e+038 double 64 1.7e-038 ~1.7e+038  5.简单数据类型的例子: 【例2.1】  public class Assign {    public static void main (String args [ ] ) {    int x , y ; //定义x,y两个整型变量   float z = 1.234f ; //指定变量z为float型,且赋初值为1.234    double w = 1.234 ; //指定变量w为double型,且赋初值为1.234    boolean flag = true ; //指定变量flag为boolean型,且赋初值为true    char c ; //定义字符型变量c    String str ; //定义字符串变量str    String str1 = " Hi " ; //指定变量str1为String型,且赋初值为Hi    c = ' A ' ; //给字符型变量c赋值'A'    str = " bye " ; //给字符串变量str赋值"bye"    x = 12 ; //给整型变量x赋值为12    y = 300; //给整型变量y赋值为300    }   }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值