20180320 java java面向对象-final变量(常量)
final修饰的变量:表示最终的变量,即常量,表示该变量只能赋值一次,不能再次赋值。
final是唯一一个可以修饰局部变量的修饰符。
常量的分类:
1、字面量(又叫"直接量"):即字面值常量,直接给出的数据值,eg:整数常量:1,2,3,布尔常量:true,false等;
2、final修饰的变量:也是一种常量。
final的要点:
一、final变量必须显示的指定初始值,系统不会为final字段初始化,eg:
class FinalDemo
{
final static string name;
public static void main(String[] args)
{
System.out.println(name);//此时会报错,因为name没有被显示初始化
}
}
以下是正确的:
class FinalDemo
{
final static string name = "ABC";
public static void main(String[] args)
{
System.out.println(name);//此时会输出 ABC
}
}
二、final变量一旦赋予初值,就不能被重复赋值,eg:
class FinalDemo
{
final static string name = "ABC";
public static void main(String[] args)
{
name = "DEF";
System.out.println(name);//此时会编译 报错
}
}
三、常量名命名规范:常量名符合标识符,单词全部使用大写字母,如果是多个单词组成使用下换线分开,eg:
int类型的最大值 final MAX_VALUE = ...;
全局静态常量:使用public static final修饰的变量,public表示任何地方都可以调用, static表示直接用类名调用, final表示只能调用,不能更改。
面试题解析:final修饰的引用类型变量到底表示引用的地址不能改变还是引用空间的数据不能改变?
引用地址里的数据可以改变:
class FinalDemo
{
public static void main(String[] args)
{
final Person p=new Person();
System.out.println(p.info);//正常编译,输出ABC
p.info = "BCD";
System.out.println(p.info);//正常编译,输出BCD
}
}
class Peson
{
public String info = "ABC";
}
不能重新分配内存地址:
class FinalDemo
{
public static void main(String[] args)
{
final Person p=new Person();
System.out.println(p.info);//
p=new Person();//此时编译出错
}
}
class Peson
{
public String info = "ABC";
}
正确:
------------- 指向 -------------
| p 0x1234 | --------->| |
| | | name ABC |
| | | |
------------- | 变成 BCD |
-------------
错误:
------------- 指向 -------------
| p 0x1234 | --------->| |
| | | | name ABC |
| | | | |
------------- | | |
| -------------
|
|重新指向-------------
-------->| |
| name ABC |
| |
| |
-------------
以下情况使用常量:
当在程序中,多个地方使用到共同的数据,且该数据不会改变,此时我们定义一个全局的常量。
一般的,我们在开发中专门定义一个常量类,专门用来存储常量数据。
eg:
//常量类
class Contents
{
public static final int X_SIZE = 10;
public static final int Y_SIZE = 20;
}
class FinalDemo
{
public static void XXX()
{
System.out.println("X坐标:" + Contents.X_SIZE);
}
public static void YYY()
{
System.out.println("Y坐标:" + Contents.Y_SIZE);
}
public static void main(String[] args)
{
System.out.println("X坐标和Y坐标:" + Contents.X_SIZE + " " + Contents.Y_SIZE);
}
}