final 可以用来修饰的结构:类、方法、变量
- 此修饰类不能被其他类所继承。比如:
String类、System类、StringBuffer类 - 修饰的方法不可以被重写。比如:
Object类中的getClass(); - 修饰的"变量"就称为是一个常量。
修饰属性:显式初始化、代码块中初始化、构造器中初始化;static final 修饰属性时为 全局常量
修饰局部变量:形参是一个常量,调用此方法时,给 常量形参 赋一个 实参 。一旦赋值后就只能在方法体内使用此形参,不能重新赋值。
package classobject.lzq06.staticfinal;
/**
* @author Liuzhen
* @create 2021-11
*/
public class FinalTest {
static final int WIDTH = 0; //全局常量
final int LEFT;
final int RIGHT;
{
//代码块中初始化
LEFT = 1;
}
public FinalTest(){
RIGHT = 2;
}
public FinalTest(int n) {//构造器中初始化
RIGHT = n;
}
public void doWidth(){
//width = 20;编译错误,类可以直接调
}
public void show(){
final int NUM = 10;//常量
//NUM += 20; 编译错误,局部常量
}
public void show(final int num){
//num = 20; 编译不通过
System.out.println(num);//只能调用
}
public static void main(String[] args) {
int num = 5; //显示初始化
System.out.println( FinalTest.WIDTH ); // 0,类直接调用
System.out.println();
FinalTest test = new FinalTest();
System.out.println( test.LEFT ); // 1
System.out.println( test.RIGHT ); //2
test.show(3); //3
}
}
类似指针常量 int * const p
C:指针变量不允许修改!指针指向一个地址该地址不能被修改,但该地址里的内容可以被修改
*p=7;//操作成功 p=&b;//操作错误
Java:不可以改变此对象的地址,但可以改变指向这个地址内存空间的值
package classobject.lzq06.staticfinal;
/**
* @author Liuzhen
* @create 2021-11
*/
public class ConstP {
public static void main(String[] args) {
Fp fp = new Fp();
new ConstP().addOne(fp);
}
public void addOne(final Fp fp){ //常量对象(地址)
fp.i++; //不可以改变此对象的地址,但可以改变指向这个地址内存空间的值
System.out.println(fp.i);
}
}
class Fp{
public int i;
}
补充:常量指针 const int *p = &a;
本质是指针,并且这个指针是一个指向常量的指针,指针指向的变量的值不可通过该指针修改,但是指针 指向的值(地址)可以改变。
*p=7;//操作错误 p=&b;//操作成功
浙公网安备 33010602011771号