在任何开发语言中,都须要定义常量。在Java开发语言平台中也不例外。不过在Java常量定义的时候,跟其余语言有所不一样。其有本身的特点。在这篇文章中,主要针对Java语言中定义常量的注意事项进行解析,帮助各位程序开发人员更好的掌握常量的定义与管理工做。 1、常量定义的基本注意事项 在Java语言中,主要是利用final关键字(在Java类中灵活使用Static关键字)来进行Java常量定义。当常量被设定后,通常状况下就不容许再进行更改。如能够利用以下的形式来定义一个常量:final double PI=3.1315。在定义这个常量时,须要注意以下内容: 一是Java常量定义的时候,就须要对常量进行初始化。也就是说,必需要在常量声明时对其进行初始化。都跟局部变量或者成员变量不一样。当在常量定义的时候初始化事后,在应用程序中就没法再次对这个常量进行赋值。若是强行赋值的话,数据库会跳出错误信息,并拒绝接受这一个新的值。 二是final关键字使用的范围。这个final关键字不只能够用来修饰基本数据类型的常量,还能够用来修饰对象的引用或者方法。如数组就是一个对象引用。为此可使用final关键字来定义一个常量的数组。这就是Java语言中一个很大的特点。一旦一个数组对象被final关键字设置为常量数组以后,它只可以恒定的指向一个数组对象,没法将其改变指向另一个对象,也没法更改数组(有序数组的插入方法可以使用的二分查找算法)中的值。 三是须要注意常量的命名规则。不一样的语言,在定义变量或者常量的时候,都有本身一套编码规则。这主要是为了提升代码的共享程度与提升代码的易读性。在Java常量定义的时候,也有本身的一套规则。如在给常量取名的时候,通常都用大写字符。在Java语言中,大小写字符是敏感的。之因此采用大写字符,主要是跟变量进行区分。虽说给常量取名时采用小写字符,也不会有语法上的错误。可是,为了在编写代码时可以一目了然的判断变量与常量,最好仍是可以将常量设置为大写字符。另外,在常量中,每每经过下划线来分隔不一样的字符。而不想对象名或者类名那样,经过首字符大写的方式来进行分隔。这些规则虽然不是强制性的规则,可是为了提升代码友好性,方便开发团队中的其余成员阅读,这些规则仍是须要遵照的。没有规矩,不成方圆。 总之,Java开发人员须要注意,被定义为final的常量须要采用大写字母命名,而且中间最好使用下划线做为分隔符来进行链接多个单词。在定义final的数据不管是常量、对象引用仍是数组,在主函数中都不能够改变。不然的话,会被编辑器拒绝并提示错误信息。 2、Final关键字与static关键字同时使用 因为Javal是面向对象的语言,因此在Java常量定义的时候还有与其它编程语言不一样的地方。如一段程序代码从编辑到最后执行,即便须要通过两个过程,分别为代码的装载与对象的创建。不一样的过程对于常量的影响是不一样的。如今假设有以下的代码: Private static Random rd1=new Random(); //实例化一个随机数生成对象。 Private final int int1=rd1.nestInt(10); //生成随机数并赋值给常量int1 Private static final int int2=rd1.nestInt(10); //生成随机数并赋值给常量int2 这上面的语句的大体含义是,经过Java语言提供的随机数类对象,生成随机数。并把生成的随机数赋值给常量int1与int2。细心的读者会发现,虽然一样是赋值语句,可是以上两个语句中有一个细小的差异,即在第二条语句中多了一个关键字static。关于关键字的用途,笔者在之前的文章中也有谈到过。这个是一个静态的概念。即当利用这个关键字来修饰一个变量的时候,在建立对象以前就会为这个变量在内存中建立一个存储空间。之后建立对对象若是须要用到这个静态变量,那么就会共享这一个变量的存储空间。也就是说,在建立对象的时候,若是用到这个变量,那么系统不会为其再分配一个存储空间,而只是将这个内存存储空间的地址赋值给他。如此作的好处就是可让多个对象采用相同的初始变量。当须要改变多个对象中变量值的时候,只须要改变一次便可。从这个特性上来讲,其跟常量的做用比较相似。不过其并不可以取代常量的做用。 那么以上两条语句有什么差异吗?咱们首先来看Private final int int1=rd1.nestInt(10)这条语句。虽然int1也是一个常量,可是其是在对象创建的时候初始化的。如如今须要建立两个对象,那么须要对这个变量初始化两次。而在两次对象初始化的过程当中,因为生成的随机数不一样,因此常量初始化的值也不一样。最后致使的结果就是,虽然int1是常量,可是在不一样对象中,其值有多是不一样的。可见,使用final的Java常量定义并非恒定不变的。由于默认状况下,定义的常量是在对象创建的时候被初始化。若是在创建常量时,直接赋一个固定的值,而不是经过其余对象或者函数来赋值,那么这个常量的值就是恒定不变的,即在多个对象中值也使相同的。可是若是在给常量赋值的时候,采用的是一些函数或者对象(如生成随机数的Random对象),那么每次创建对象时其给常量的初始化值就有可能不一样。这每每是程序开发人员不原意看到的。有时候程序开发人员但愿创建再多的对象,其在多个对象中引用常量的值都是相同的。 要是现这个需求的话,有两个方法。一是在给常量赋值的时候,直接赋予一个固定的值,如abcd等等。而不是一个会根据环境变化的函数或者对象。像生成随机数的对象,每次运行时其结果都有可能不能。利用这个对象来对常量进行初始化的时候,那么结果可能每次建立对象时这个结果都有可能不一样。最后这个常量只可以作到在一个对象内是恒定不变的,而没法作到在一个应用程序内是恒定不变的。另一个方法就是将关键字static与关键字final同时使用。一个被定义为final的对象引用或者常量只可以指向惟一的一个对象,不能够将他再指向其余对象。可是,正如上面举的一个随机数的例子,对象自己的内容的值是能够改变的。为了作到一个常量在一个应用程序内真的不被更改,就须要将常量声明为staitc final的常量。这是什么意思呢?正如上面笔者所说的,当执行一个应用程序的时候,能够分为两个步骤,分别为代码装载与对象建立。为了确保在全部状况下(即建立多个对象状况下)应用程序还可以获得一个相同值的常量,那么就最好告诉编译器,在代码装载的时候就初始化常量的值。而后在后续建立对象的时候,只引用这个常量对象的地址,而不对其再进行再次初始化。就如同Private static final int int2=rd1.nestInt(10)这种形式来定义常量。如此,在后续屡次建立对象后,这个常量int2的值都是相同的。由于在建立对象时,其只是引用这个常量,而不会对这个常量再次进行初始化。 因为加上这个static关键字以后,至关于改变了Java常量定义的做用范围。为此程序开发人员须要了解本身的需求,而后选择是否须要使用这个关键字。在初始化常量的时候,若是采用函数(如系统当前时间)或者对象(如生成随机数的对象)来初始化常量,能够预见到在每次初始化这个常量时可能获得不一样的值,就须要考虑是否要采用这个static关键字。通常状况下,若是只须要保证在对象内部采用这个常量的话,那么这个关键字就无关紧要的。可是反过来,若是须要在多个对象中引用这个常量,而且须要其值相同,那么就必需要采用static这个关键字了。以确保不一样对象中都只有一个常量的值。或者说,不一样对象中引用的常量其实指向的是内存中的同一块区域。