注:本节不着重讨论,final和static。具体讨论详见《修饰词专题(暂定名)》。
在《java程序设计教程》书中并未见到常量概念。
所谓常量可以理解成一种特殊的变量,它的值被设定后,在程序运行过程中不允许被改变。
final 常量名=值;
final double PI=3.14; final String LOVE="imooc";
常量名一般使用大写字符。
实际只有第一种是常量的。
1)如果该成员域同时具有最终属性(final)和静态属性(static),则该成员域只能在定义时赋值。
如static final double PA=3.8;
如:public class Test {
public void ape(){
public int bb=3;
}
}
会报错Illegal modifier for parameter bb; only final is permitted。即bb有个非法修饰符,只有final才能用(只有final才能用在方法里面)
构造方法,成员方法均尝试过! ※
继续,只能在定义时赋值:
比如这样
①.1static final Student std=new Student("213");
①.2static final(这里加不加final对要说明的原理没有影响) Student std=new Student("213");
static final Student afg=std;//这一行是重点
别看afg=std指向同一个对象了,常量就是值设定好了,内存中已确定,后来再改std指向的对象的值(假设std没用final修饰,afg指向的对象也是不会变的)
static成员变量 即类变量 是类加载到内存中时变量即分配内存。
所以 这样创建,是会报错的:
int a=4;
static int cd=a;
报错:Cannot make a static reference to the non-static field a
因为 a(成员变量)只有在类实例化的时候,才会被分配内存。换言之,才会被创建。
但cd(类变量)是类加载到内存的时候就要求被创建,所以会报错。
只能这样static int cd=1;
或这样 static int a=4;
static int cd=a;
but,
static int cd;
static Student stu;
这种只声明不初始化是完全可以的,值为0(int基本数据类型变)或为null(stu引用数据类型变量)。 ※
再扯回来:
只能在定义时赋值。
只声明不去初始化 都错:
static final Student afg;
static final int a;
报错:The blank final field a may not have been initialized。即空白final域a可能没有初始化。
—————————————————————————————
严格意义上来讲,只有上面的叫常量。
2)如果成员域具有最终属性(final),但不具有静态属性(static),则该成员域只能在定义时 或 在构造方法中赋值,只能赋值一次。
如
①.1final Student std=new Student("213");
①.2Student sss=new Student("213");
Student std=sss;
②
public class Test {
final Student stdf;
Test(){
stdf=new Student("546");
}
}
但是必须所有构造方法都得给它赋值,写多个构造方法,有一个没给它赋值就会报The blank final field stdf may not have been initialized。 即空白的final域stdf可能没有被初始化。
为什么有static时,只能在定义时赋值呢。因为类变量要在类加载到内存中时才初始化。
程序中使用常量可以提高代码的可维护性。例如,在项目开发时,我们需要指定用户的性别,此时可以定义一个常量 SEX,赋值为 "男",在需要指定用户性别的地方直接调用此常量即可,避免了由于用户的不规范赋值导致程序出错的情况。
系统类java.lang.Math中成员域PI的定义为:
public static final double PI =3.14159265358979323846;
用PI时,直接Math.PI代替。
这样简单粗暴才像常量。