现在的位置: 首页 > 综合 > 正文

final 修饰符

2017年11月30日 ⁄ 综合 ⁄ 共 2267字 ⁄ 字号 评论关闭

 final可用来修饰类,变量,方法。

 1.final修饰变量:final修饰变量时,表示该变量一旦获得了初始值之后就不可改变。

                                1.修饰成员变量: 与普通成员变量不同的是,final成员变量(实例属性和类属性)必须由程序员显示初始化,系统不会对final成员变量进行隐式初始化。

                                 非final修饰的成员变量初始化过程:当进行静态初始化时,可对类属性初始化,当执行普通初始化块,构造器时可对实例属性初始化,因此:非final成员变量的初始值,可以在定义该变量时指定初始值,可以在初始化块,构造器中执行初始化值,否则成员变量的初始值是由系统自动分配的初始值。

                                  final修饰的类属性,实例属性指定初始值的地方:

                                                                                            类属性:静态初始化块,声明该属性时指定初始值。

                                                                                            实例属性:非静态初始化块,构造器,声明该属性时指定初始化值。

 

2.final修饰局部变量:

                                    1.系统不会对局部变量进行初始化,必须由程序员显示初始化。

                                        如果在定义final变量时没有指定初始值,则可以在后面代码中进行对final变量赋初始值,但只能一次,不能重复赋值,,如果final修饰的局部变量在定义时已经指定默认值,则后面的代码中不能再对该变量赋值。

                                      2.final修饰形参不能被赋值,因为形参在调用该方法时,有系统传入的参数来完成初始化。

                                 

 

3.final修饰基本类型变量与引用类型变量的区别:

                                     1.final修饰基本类型变量时,不能对基本变量重新赋值,因为基本类型变量不能被改变。

                                      2.final修饰引用类型变量时,仅仅保持的是这个引用所引用的地址不会改变,既一直引用同一个对象。但这个对象完全可以改变(对象的属性)

                                       例如: final person p = new person();

                                                            //改变person对象的age属性,合法。

                                                 p.SetAge(23);

                                                 //对p引用重新赋值,不合法。

                                                  p = null;

                                         注意:如果final修饰变量是基本数据类型,且在编译时就可以确定该变量的值,于是把该变量当做常量来处理:常量命名规则:多个有意义的单词连接,所有字符大写,单词之间用下划线分割。

                                                     如果final修饰变量是引用类型,final变量无法在编译时就获得值,而必须在运行时才能得到值如:final  TestClass t = new TestClass();编译时系统不会创建一个TestClass对象赋给 t 变量,所以t不需要当做常量来处理,无需使用常量命名规则。

 

 

4.final方法:

                   1.final修饰的方法不可被重写。

                    2.java提供的Object类有一个final方法:getClass(),因为java不希望任何一个类重写这个方法。

                    3.对于private 方法,仅在当前类中可见,子类无法访问,所以也就无法重写该方法,如果子类中定义了一个与父类private方法有相同方法名,相同形参列表,相同返回值类项的方法,也不是方法重写,只是重新定义了一个方法,因此使用final修饰的一个private 访问权限的方法,依然可以在其子类中定义与该方法有相同方法名,相同形参列表,相同返回值类型的方法。

                    4.final修饰的方法不能被重写但完全可以被重载。

 

5.final类:

                     1.final修饰的类不可有子类,java.lang.Math类就是一个final类,它不可以有子类。

【上篇】
【下篇】

抱歉!评论已关闭.