java中final修饰符的使用方法

final关键字可用于修饰类,变量和方法,final关键字用于表示它修饰的类,方法和变量不可改变.
final修饰变量时:表示该变量一旦获得了初始化值就不可被改变,final即可以修饰成员变量(包括变量和实例变量),也可以修饰局部变量,形参.
final修饰的变量不能被 赋值,这种说法是错误的,严格的来说,final修饰的变量是不可被改变的,一旦获得初始值,该final的值就不能被重新赋值,因此final修饰成员变量和修饰局部变量时有一定的不同.
final成员变量:
成员变量是随类初始化或对象初始化的.当类初始化时,系统会为该类的类变量分配内存,并分配默认值;当创建对象时,系统会为该对象的实例变量分配内存,并分配默认值.也就是说.当执行静态初始化块时可以对类变量赋初始值;当执行普通初始化块,构造时可对实例变量赋初始值.因此,成员变量的初始值可以在定义该变量时指定默认值,也可以在初始化块,构造器中指定初始值.
对于final修饰的成员变量而言,一旦有了初始值,就不能被重新赋予新值,如果即没有在定义成员变量时指定初始值,也没有在初始化块,构造器中为成员变量指定初始值,那么这些成员变量的值将一直是系统默认分配的0,"/u00000",false或null,这些成员变量也就失去了存在的意义. 因此java语法规定:final修饰的成员变量必需由程序员显示地指定初始值.
归纳起来,final修饰的成员变量,实例变量能指定初始值的地方如下:
类变量: 必需在 静态初始化块 中指定初始值或者 声明该类变量时 指定初始值,而且只能在这两个地方的其中之一指定
实例变量:必需在 非静态初始化块 , 声明该实例变量 构造器中指定初始值 ,而且只能在三个地方之一指定
final修饰的实例变量: 要么在定义该实例变量时指定初始值,要么在普通初始化块或者构造器中为该实例变量指定初始值.但注意:普通初始化块已经为某个实例变量指定了初始值,则不能再在构造器中为该实例指定初始值;
final修饰的类变量,要么在定义该类变量时指定初始值,要么在静态初始化块中为该类变量指定初始值.
实例变量不能在静态初始化块中指定初始值,因为静态初始化块是静态成员,不可访问实例变量-非静态成员.
类变量不能在普通初始化块中指定处置室,因为类变量在类初始化阶段已经被初始化了,普通初始化块不能对其重新赋值.
可以通过下面例子更快地了解.
public class FinalVariableTest {
   //声明时初始化
    final int a = 6;//实例变量
    final String str;//实例变量
    final int c;//实例变量
    final static double d;//类变量
    final char ch;//实例变量
  //初始化块,客队没有指定默认值地实例表量指定初始值
    {
        str = "Hello";
        
    }
//静态初始化块,客队没有指定默认值地类变量指定初始值
    static {
        d = 5.6;

    }
//构造器初始化,初始化块优先构造器
    public FinalVariableTest() {
        ch = 'i';
        c = 5;
    }
//普通方法初始化
    public void changeFinal() {


    }

    public static void main(String[] args) {

        FinalVariableTest ft = new FinalVariableTest();
        System.out.println(ft.a);
        System.out.println(ft.c);
        System.out.println(ft.d);
        System.out.println(ft.ch);
    }

}

实例变量和类变量地区别
实例变量
1.实例变量声明在一个类中,但在方法、构造方法和语句块之外;
2.当一个对象被实例化之后,每个实例变量的值就跟着确定;
3.实例变量在对象创建的时候创建,在对象被销毁的时候销毁;
4.实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;
5.实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;
6.实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;
7.实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObejectReference.VariableName。
类变量(静态变量)
1.类变量也称为静态变量,在类中以static关键字声明,但必须在方法构造方法和语句块之外。
2.无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。
3.静态变量除了被声明为常量外很少使用。常量是指声明为public/private,final和static类型的变量。常量初始化后不可改变。
4.静态变量储存在静态存储区。经常被声明为常量,很少单独使用static声明变量。
5.静态变量在程序开始时创建,在程序结束时销毁。
6.与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为public类型。
7.默认值和实例变量相似。数值型变量默认值是0,布尔型默认值是false,引用类型默认值是null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。
8.静态变量可以通过: ClassName.VariableName 的方式访问。
9.类变量被声明为public static final类型时,类变量名称必须使用大写字母。如果静态变量不是public和final类型,其命名方式与实例变量以及局部变量的命名方式一致。

final局部变量
系统不会对局部变量初始化,局部变量必需由程序员显示初始化.因此使用final修饰局部变量时,既可以在定义时指定默认值,也可以不指定默认值.
如果final修饰地局部变量在定义时没有指定默认值,则可以在后面代码中对该final变量赋初值.但是只能一次,不能重复赋值;如果final修饰的局部变量在定义时已经指定默认值,则后面代码中不能再对该变量赋初值.

//该方法是某类中的成员函数
public  void  test(final  int a){

    

}


如这种形式的final,系统只能根据传入的参数完成初始化,因此使用final修饰的 形参不能被赋值

final修饰基本类型变量和引用类型变量的区别
当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不能被改变.
对于引用类型变量而言,它保存的仅仅是一个引用,final只保证这个引用类型变量所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以改变.
比如
  final int[] iArr = {2,3,5};
  iArr[3]=-4;//合法
 iArr = null;//非法
final Person  p = new Person(45);//实例一个Person对象,并初始化age成员变量.
p.setAge(34);//合法
p=null;//非法 


从上面例子可以看出,使用final修饰的引用类型变量不能被重新赋予新值,但是可以改变引用类型比那辆所引用对象的内容.
对一个final变量来说,不管它是类变量,实例变量,还是局部变量.只要满足三个条件,这个final变量就不再是一个变量,而是相当于一个直接量.
1.使用final修饰符修饰
2.在定义该final变量时指定了初始值
3.该初始值可以在编译时就被确定下来



可执行的"宏替换"的final变量()

final方法
final修饰的方法不可被重写,如果出于某种原因,不希望子类重写父类的某个方法,则可以使用final修饰该方法.
注意:即使使用final修饰一个private访问权限的方法,依然可以在其子类中定义与该方法具有相同方法名,相同形参列表,相同返回值类型的方法,因为private修饰的方法仅在当前类中可见,其他子类无法访问.如果子类中存在,那么也是重新定义的一个新方法.

final类
final修饰的类不能有子类(出于安全性考虑),因为子类继承父类的一些可见方法时,会重写该方法.

不可变类(不做详解):
创建该类的实例后,该实例变量是不可改变的.
Double d = new Double(6.5);//程序没有提供修改这个实例变量的方法

缓存实例的不可变类(不做详解)



































































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值